我有一个在根作用域上发出广播事件的 Controller 。我想测试广播事件是否正确触发。
我的 Controller 中的代码如下所示:
$scope.$watch("pageIndex", function(){
if($scope.pageIndex == 4)
{
// emit social share
$rootScope.$broadcast('myEvent');
}
});
我尝试使用以下代码对其进行测试:
it('Should call myEvent when pageIndex is 4',function(){
scope.pageIndex = 4;
scope.$apply();
expect(rootScope.$on).toHaveBeenCalledWith('myEvent');
});
但它告诉我代码没有被调用,我已经手动测试了它。然后我尝试使用以下代码:
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();
});
但结果却是一样的负面结果。有没有办法测试事件是否被广播?
最佳答案
假设您使用 Jasmine,以下内容对我来说非常有用。
... 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');
});
});
如果您要广播消息并向其附加对象,您甚至可以测试这些对象是否符合预期
someObj = { ... something ... };
expect(rootScope.$broadcast).toHaveBeenCalledWith('someEvent', someObj);
关于unit-testing - 如何在 AngularJS 中测试广播事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16757503/