spyOn 侦听器监视功能不起作用
spyOn listener watch function not working
当我尝试监视 $scope.$watch 的侦听器函数时,就像永远不会调用 spyOn
http://jsfiddle.net/b8LoLwLb/1/
我的控制器
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 无关,但与 属性 持有的函数引用有关。当你在控制器实例化上做$scope.$watch('name', this.changeName)
时,this.changeName
(当时)持有的函数引用被设置被观看。即使你 spyOn 控制器实例上的函数(later),属性changeName
持有的函数引用控制器实例仅更改(更改为由 jasmine 创建的用于跟踪调用的包装函数)但观察器没有更改,因为它仍然使用原始函数引用。因此,当 watch 执行时,它只会运行实际的函数引用,而不是稍后在 changeName
属性.
上设置的间谍函数引用
相反,如果您在控制器中执行此操作:
var vm = this;
$scope.$watch('name', function(){
vm.changeName();
});
您将看到您的测试通过。
当我尝试监视 $scope.$watch 的侦听器函数时,就像永远不会调用 spyOn
http://jsfiddle.net/b8LoLwLb/1/
我的控制器
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 无关,但与 属性 持有的函数引用有关。当你在控制器实例化上做$scope.$watch('name', this.changeName)
时,this.changeName
(当时)持有的函数引用被设置被观看。即使你 spyOn 控制器实例上的函数(later),属性changeName
持有的函数引用控制器实例仅更改(更改为由 jasmine 创建的用于跟踪调用的包装函数)但观察器没有更改,因为它仍然使用原始函数引用。因此,当 watch 执行时,它只会运行实际的函数引用,而不是稍后在 changeName
属性.
相反,如果您在控制器中执行此操作:
var vm = this;
$scope.$watch('name', function(){
vm.changeName();
});
您将看到您的测试通过。