13

我的 Angular 应用程序中有一个带有事件侦听器的控制器,定义如下。

  angular.module('test').controller('TestCtrl', function($rootScope, $scope, testService) {

    [...]

    $scope.$on("myEvent", function(args, value) {
      testService.doStuff(value);
    });
  });

这在应用程序本身中完美运行。但是,当我尝试对控制器的功能进行单元测试(使用JasmineKarma)时,每个测试方法都会引发以下错误:

 TypeError: $scope.$on is not a function in [...]/testController.js

我在我的测试方法中创建控制器如下。

  it('does stuff', inject(function($rootScope, $controller, testService) {
    var scope = $rootScope.$new;
    $controller('TestCtrl', {
      $scope : scope
    });

    [...]
  }));

我可以通过更改我的控制器来解决这个问题rootScope

  $rootScope.$on(...)

但是当然该应用程序不再按预期工作。$on我还可以通过在我的测试代码中引入该方法来摆脱错误:

  var scope = $rootScope.$new;
  scope.$on = function() {};

但是像这样嘲笑听众违背了测试我的真实代码的目的。

为什么测试代码找不到 $on 方法 scope(但找到它rootScope,仍然......)

一定有一些基本的东西我在这里遗漏了,但即使经过大量谷歌搜索和阅读 Angular 源代码,我也无法弄清楚。

4

1 回答 1

16

$rootScope.$new是一个函数。您需要调用它 ( $rootScope.$new()):

it('does stuff', inject(function($rootScope, $controller, testService) {
  var scope = $rootScope.$new();
  $controller('TestCtrl', {
    $scope : scope
  });

  [...]
}));

示例 plunk:http ://plnkr.co/edit/t1x62msmOQDkNItGzcp9?p=preview

于 2013-05-21T14:11:35.050 回答