在我的Angular Controller 中,我实现了一个侦听器,该侦听器通过引用来调用函数:
$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();
});
在我看来,匿名功能在这种情况下是没有用的。您知道如何使 spy 程序具有引用功能吗?
谢谢
最佳答案
在为事件分配处理程序时,将为它提供指向函数的链接,而不是指向对象属性的链接。等同于写:
var handler = vm.popoverChooseProfile.remove;
$scope.$on('$destroy', handler);
Jasmine检查是否已调用该函数,将原始属性替换为其自己的函数,如果调用了它,则保存状态,并在需要时调用原始函数。
因此,在事件发生时,vm.popoverChooseProfile.remove!==处理程序,因此测试失败。
要修复它,您应该像做包装一样,或者在设置事件侦听器之前设置spyOn。