gpt4 book ai didi

javascript - spyOn 监听器监视功能不起作用

转载 作者:行者123 更新时间:2023-11-28 00:12:08 26 4
gpt4 key购买 nike

当我尝试监视 $scope.$watch 的监听器函数时,就像从未调用过 spy On

http://jsfiddle.net/b8LoLwLb/1/

我的 Controller

angular.module('angularApp')
.controller('MainCtrl', function ($scope) {
$scope.name = '';

this.changeName = function () {
console.log('the name has change to ' + $scope.name);
};

$scope.$watch('name', this.changeName);
});

我的测试

describe('Controller: MainCtrl', function () {

// load the controller's module
beforeEach(module('angularApp'));

var MainCtrl,
scope;

// Initialize the controller and a mock scope
beforeEach(inject(function ($controller, $rootScope) {
scope = $rootScope.$new();
MainCtrl = $controller('MainCtrl', {
$scope: scope
});
}));

it('should check if watcher was triggered', function () {
// Spy the listener funtion
spyOn(MainCtrl, 'changeName');

// Change the watched property
scope.name = 'facu';

// Digest to trigger the watcher.
scope.$digest();

// Expect the function to have been called
expect(MainCtrl.changeName).toHaveBeenCalled();
});
});

问题在于,测试不是监视该函数,而是执行它并打印控制台日志。

我使用的是 Angular 1.4

最佳答案

这是预期的行为,它与 jasmine 或 Angular 无关,但与属性持有的函数引用有关。当您在 Controller 实例化上执行 $scope.$watch('name', this.changeName) 时,this.changeName(那时)被设置为观看。即使您监视 Controller 实例上的函数(稍后), Controller 实例的属性 changeName 所持有的函数引用也只会更改(到 jasmine 创建的包装函数来跟踪调用),但不是观察者的,因为它仍然使用原始函数引用。因此,当 watch 执行时,它只运行实际的函数引用,而不是稍后您在 changeName 属性上设置的 spy 函数引用。

如果您在 Controller 中执行此操作:

   var vm = this;
$scope.$watch('name', function(){
vm.changeName();
});

您将看到测试通过。

关于javascript - spyOn 监听器监视功能不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30789582/

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