在我的Angular控制器中,我实现了一个监听器,它通过引用调用一个函数:
$scope.$on('$destroy', vm.popoverChooseProfile.remove);
我已经与Karma和Jasmine进行了测试。
it('should remove the popover the scope is destroy', function() {
var vm = createController();
vm.popoverChooseProfile = MOCK_POPOVER;
spyOn(vm.popoverChooseProfile, 'remove');
$scope.$destroy();
expect(vm.popoverChooseProfile.remove).toHaveBeenCalled();
});
上面的测试失败但如果我在匿名函数中包装vm.popoverChooseProfile.remove引用,则测试成功
$scope.$on('$destroy', function() {
vm.popoverChooseProfile.remove();
});
在我看来,匿名函数在这种情况下是无用的。您是否知道如何使用参考函数使间谍工作?
谢谢
答案 0 :(得分:1)
为事件分配处理程序时,为其指定函数的链接,而不是对象的属性。这与写:
相同var handler = vm.popoverChooseProfile.remove;
$scope.$on('$destroy', handler);
Jasmine,检查函数是否已被调用,将原始属性替换为自己的函数,如果调用它则保存状态,并在需要时调用原始函数。
所以在事件发生时,vm.popoverChooseProfile.remove!==处理程序,所以测试失败。
要修复它,你应该像你一样进行包装,或者在设置事件监听器之前设置spyOn。