我试图触发在$rootScope.broadcast()事件时触发的控制器中的$scope.$on()方法.我发现这个问题很有用:
How can I test events in angular?,但是我仍然无法通过控制器的$scope检测从$rootScope广播的事件.
到目前为止,我已经设法测试在相应的$rootScope上调用$broadcast方法,但是在$rootScope上调用$broadcast时,并没有在相应的$scope上调用$on方法.
我试图在我的测试中直接播放$rootScope.$,但是我的间谍没有接受这个事件.
这是我的控制器:
angular.module('app.admin.controllers.notes',[]) .controller('NotesCtrl',function($scope) { $scope.$on('resource-loaded',function(event,resource) { // I want to test this $scope.parentType = resource.type; $scope.parentId = resource.id; }); });
这是我的测试:
describe('The notes controller',function() { beforeEach(module('app.admin.controllers.notes')); var scope,rootScope,NotesCtrl; beforeEach(inject(function($controller,$injector,$rootScope) { rootScope = $rootScope; scope = $rootScope.$new(); // I've tried this with and without $new() NotesCtrl = $controller('NotesCtrl',{$scope: scope}); // I've tried explicitly defining $rootScope here })); it('should respond to the `resource-loaded` event',function() { spyOn(scope,'$on'); rootScope.$broadcast('resource-loaded'); // This is what I expect to trigger the `$on` method expect(scope.$on).toHaveBeenCalled(); }); });
和here’s the plunkr.我已经包含了$broadcast方法的通过测试以供参考,主要是因为我以相同的方式设置了测试.
我已经阅读了很多关于在AngularJS中测试事件的问题,它似乎总是一个范围问题.我听说在Karma单元测试中,$rootScope和$scope是一回事,但我不确定其含义是什么.我已经尝试将$rootScope和$scope定义为同一个对象,并在测试期间明确地将$rootScope注入NotesCtrl,但没有任何东西使我的测试变为绿色.