Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Jasmine SpyOn在函数参考don';t工作(角度)_Javascript_Angularjs_Jasmine - Fatal编程技术网

Javascript Jasmine SpyOn在函数参考don';t工作(角度)

Javascript Jasmine SpyOn在函数参考don';t工作(角度),javascript,angularjs,jasmine,Javascript,Angularjs,Jasmine,在我的Angular controller中,我实现了一个侦听器,它通过引用调用函数: $scope.$on('$destroy', vm.popoverChooseProfile.remove); 我已经用Karma和Jasmine进行了测试 it('should remove the popover the scope is destroy', function() { var vm = createController(); vm.popoverChooseProf

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

});
在我看来,匿名函数在这种情况下是无用的。你知道如何使间谍具有参考功能吗


谢谢

当您为事件分配处理程序时,您为它提供了指向函数的链接,而不是指向对象属性的链接。这与写:

var handler = vm.popoverChooseProfile.remove;
$scope.$on('$destroy', handler);
Jasmine检查函数是否已被调用,将原始属性替换为其自己的函数,这将在调用时保存状态,并在需要时调用原始函数

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

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