我的 Angular 应用程序中有一个带有事件侦听器的控制器,定义如下。
angular.module('test').controller('TestCtrl', function($rootScope, $scope, testService) {
[...]
$scope.$on("myEvent", function(args, value) {
testService.doStuff(value);
});
});
这在应用程序本身中完美运行。但是,当我尝试对控制器的功能进行单元测试(使用Jasmine和Karma)时,每个测试方法都会引发以下错误:
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 源代码,我也无法弄清楚。