单元测试 – 我如何在AngularJS测试广播事件

前端之家收集整理的这篇文章主要介绍了单元测试 – 我如何在AngularJS测试广播事件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个控制器在rootscope上发出广播事件。我想测试broacast事件被正确触发。

我的代码在我的控制器看起来像这样:

$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);

猜你在找的Angularjs相关文章