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

09-25 16:46
查看更多