业力测试 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();
});
这将起作用,因为摘要循环将处理广播
我有一小段代码可以简单地在 $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();
});
这将起作用,因为摘要循环将处理广播