我如何在AngularJS中testing广播事件

我有一个控制器,它在Rootcope上发出一个广播事件。 我想testingbroacast事件是否正确启动。

我的控制器中的代码如下所示:

$scope.$watch("pageIndex", function(){ if($scope.pageIndex == 4) { // emit social share $rootScope.$broadcast('myEvent'); } }); 

我试图用下面的代码来testing它:

  it('Should call myEvent when pageIndex is 4',function(){ scope.pageIndex = 4; scope.$apply(); expect(rootScope.$on).toHaveBeenCalledWith('myEvent'); }); 

但它告诉我,代码没有被调用,我已经手动testing它。 然后我尝试了下面的代码:

 it('Should call myEvent when pageIndex is 4',function(){ var listener = jasmine.createSpy('listener'); rootScope.$on('myEvent', listener); scope.pageIndex = 4; scope.$apply(); expect(listener).toHaveBeenCalled(); }); 

但是同样的负面结果。 有没有办法testing一个事件是否播放?

假设你正在使用茉莉花,以下工作对我很好。

 ... other unit test setup code ... var rootScope; beforeEach(inject(function($injector) { rootScope = $injector.get('$rootScope'); spyOn(rootScope, '$broadcast'); })); describe("my tests", function() { it("should broadcast something", function() { expect(rootScope.$broadcast).toHaveBeenCalledWith('myEvent'); }); }); 

如果您正在广播消息并附加对象,则甚至可以testing对象是否符合预期

 someObj = { ... something ... }; expect(rootScope.$broadcast).toHaveBeenCalledWith('someEvent', someObj); 

这是如何用mochaJs完成的,对于嘲笑和柴来说,期望值是用sinon来完成的。

 describe("broadcast test", function() { beforeEach(inject(function($rootScope){ sinon.spy($rootScope, "$broadcast") scope.foo() //this broadcasts the event. $rootScope.$broadcast("testEvent") })) it("broadcasts the event", inject(function($rootScope){ expect($rootScope.$broadcast.calledWith("testEvent")).to.be.true })) })