gpt4 book ai didi

javascript - Jasmine SpyOn haveBeenCalled 函数引用不起作用( Angular )

转载 作者:行者123 更新时间:2023-11-29 15:34:38 25 4
gpt4 key购买 nike

在我的 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。

关于javascript - Jasmine SpyOn haveBeenCalled 函数引用不起作用( Angular ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30775413/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com