Jasmine SpyOn hasBeenCalled on function reference不起作用(Angular)

时间:2015-06-11 08:24:13

标签: javascript angularjs jasmine

在我的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();

});

在我看来,匿名函数在这种情况下是无用的。您是否知道如何使用参考函数使间谍工作?

谢谢

1 个答案:

答案 0 :(得分:1)

为事件分配处理程序时,为其指定函数的链接,而不是对象的属性。这与写:

相同
var handler = vm.popoverChooseProfile.remove;
$scope.$on('$destroy', handler);

Jasmine,检查函数是否已被调用,将原始属性替换为自己的函数,如果调用它则保存状态,并在需要时调用原始函数。

所以在事件发生时,vm.popoverChooseProfile.remove!==处理程序,所以测试失败。

要修复它,你应该像你一样进行包装,或者在设置事件监听器之前设置spyOn。