业力测试 rootScope.$on $locationChangeSuccess

karma test rootScope.$on $locationChangeSuccess

我有一小段代码可以简单地在 $locationChangeSuccess 上重新加载当前 window:

$rootScope.$on('$locationChangeSuccess', function(){
    self.window.location.reload();
});

我想在 karma 中测试这个功能。这是我认为可行的方法:

beforeEach(inject(function($rootScope) {
    rootScope = $rootScope;
}));


it('should reload the window if the url changes', function() {
    spyOn(rootScope, '$on');
    rootScope.$broadcast('$locationChangeSuccess');
    expect(rootScope.$on).toHaveBeenCalled();
});

我也试过用 $emit 替换 $broadcast 得到相同的结果,关于它应该如何工作有什么建议吗?

您忘记了 angular - $digest 周期的重要部分 如果你想做单元测试,是否值得为将来记住,每次你改变一个模型并期望它触发你需要的东西时 运行 $digest 当你使用 [=13 时是一样的=] 在单元测试中测试指令。每当您希望 angular 自动执行某些操作时,您将需要执行 scope$digest() 或 rootScope.$digest()

beforeEach(inject(function($rootScope) {
    rootScope = $rootScope;
}));


it('should reload the window if the url changes', function() {
    spyOn(rootScope, '$on');
    rootScope.$broadcast('$locationChangeSuccess');
    rootScope.$digest()
    expect(rootScope.$on).toHaveBeenCalled();
});

这将起作用,因为摘要循环将处理广播