unit-testing - 如何在 AngularJS 中测试广播事件

标签 unit-testing angularjs

我有一个在根作用域上发出广播事件的 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/

相关文章:

javascript - 如何在 HTML 标签中获取动态变量的值

angularjs - 单元测试私有(private)方法

java - 如何正确地对可打包对象进行单元测试?

c# - Umbraco 单元测试

javascript - 我如何在 Protractor 测试中解决两个不同的 promise ?

javascript - 以下链接的 Angular 路线?

unit-testing - 在 Quarkus 中执行端点单元测试的最佳方法是什么?

javascript - 在私有(private)方法上使用 Jasmine spyon

angularjs - AngularJs 中选择下拉列表的第一个选项为空

angularjs - 尝试使用 angular2/Http 时出错