如何使用 Jasmine 监视匿名函数
How to spy on anonymous function using Jasmine
我正在使用 Jasmine 测试我的 angular 应用程序并想监视匿名函数。
使用angular-通知服务https://github.com/cgross/angular-notify,我想知道是否调用了通知功能。
这是我的控制器:
angular.module('module').controller('MyCtrl', function($scope, MyService, notify) {
$scope.isValid = function(obj) {
if (!MyService.isNameValid(obj.name)) {
notify({ message:'Name not valid', classes: ['alert'] });
return false;
}
}
});
这是我的测试:
'use strict';
describe('Test MyCtrl', function () {
var scope, $location, createController, controller, notify;
beforeEach(module('module'));
beforeEach(inject(function ($rootScope, $controller, _$location_, _notify_) {
$location = _$location_;
scope = $rootScope.$new();
notify = _notify_;
notify = jasmine.createSpy('spy').andReturn('test');
createController = function() {
return $controller('MyCtrl', {
'$scope': scope
});
};
}));
it('should call notify', function() {
spyOn(notify);
controller = createController();
scope.isValid('name');
expect(notify).toHaveBeenCalled();
});
});
显然 return :
Error: No method name supplied on 'spyOn(notify)'
因为它应该是类似 spyOn(notify, 'method') 的东西,但是因为它是一个匿名函数,所以它没有任何方法。
感谢您的帮助。
您可以使用 andCallFake 链接您的间谍,请参阅:
http://jasmine.github.io/1.3/introduction.html#section-Spies:_andCallFake
//create a spy and define it to change notify
notify = jasmine.createSpy().andCallFake(function() {
return false;
});
it('should be a function', function() {
expect(typeof notify).toBe('function');
});
controller = createController();
scope.isValid('name');
expect(notify).toHaveBeenCalled();
Daniel Smink 的回答是正确的,但请注意 Jasmine 2.0 的语法已更改。
notify = jasmine.createSpy().and.callFake(function() {
return false;
});
我还发现如果您只需要一个简单的实现
,直接 return 回复很有用
notify = jasmine.createSpy().and.returnValue(false);
我正在使用 Jasmine 测试我的 angular 应用程序并想监视匿名函数。 使用angular-通知服务https://github.com/cgross/angular-notify,我想知道是否调用了通知功能。
这是我的控制器:
angular.module('module').controller('MyCtrl', function($scope, MyService, notify) {
$scope.isValid = function(obj) {
if (!MyService.isNameValid(obj.name)) {
notify({ message:'Name not valid', classes: ['alert'] });
return false;
}
}
});
这是我的测试:
'use strict';
describe('Test MyCtrl', function () {
var scope, $location, createController, controller, notify;
beforeEach(module('module'));
beforeEach(inject(function ($rootScope, $controller, _$location_, _notify_) {
$location = _$location_;
scope = $rootScope.$new();
notify = _notify_;
notify = jasmine.createSpy('spy').andReturn('test');
createController = function() {
return $controller('MyCtrl', {
'$scope': scope
});
};
}));
it('should call notify', function() {
spyOn(notify);
controller = createController();
scope.isValid('name');
expect(notify).toHaveBeenCalled();
});
});
显然 return :
Error: No method name supplied on 'spyOn(notify)'
因为它应该是类似 spyOn(notify, 'method') 的东西,但是因为它是一个匿名函数,所以它没有任何方法。
感谢您的帮助。
您可以使用 andCallFake 链接您的间谍,请参阅:
http://jasmine.github.io/1.3/introduction.html#section-Spies:_andCallFake
//create a spy and define it to change notify
notify = jasmine.createSpy().andCallFake(function() {
return false;
});
it('should be a function', function() {
expect(typeof notify).toBe('function');
});
controller = createController();
scope.isValid('name');
expect(notify).toHaveBeenCalled();
Daniel Smink 的回答是正确的,但请注意 Jasmine 2.0 的语法已更改。
notify = jasmine.createSpy().and.callFake(function() {
return false;
});
我还发现如果您只需要一个简单的实现
,直接 return 回复很有用notify = jasmine.createSpy().and.returnValue(false);