Angular 使用 Jasmine 进行单元测试:如何删除或修改 spyOn
Angular unit testing with Jasmine: how to remove or modify spyOn
AngularJS v1.2.26
茉莉花 v2.2.0
如何更改或删除 spyOn
的行为?当我尝试覆盖它时,出现以下错误:Error: getUpdate has already been spied upon
var data1 = 'foo';
var data2 = 'bar';
describe("a spec with a spy", function(){
beforeEach(module('app'));
var $q;
beforeEach(inject(function(_updateService_, _$q_){
updateService = _updateService_;
//spy the results of the getUpdate()
$q = _$q_;
var deferred = $q.defer();
deferred.resolve( data1 );
spyOn(updateService, 'getUpdate').and.returnValue(deferred.promise);
}));
describe('and here the spy should be different', function() {
it('returns a different value', function() {
var deferred = $q.defer();
deferred.resolve( data2 );
spyOn(updateService, 'getUpdate'); //ERROR HERE
updateService.getUpdate.and.returnValue(deferred.promise);
...
});
});
...
当我删除第二个 spyOn 时,测试不起作用。
我该怎么做?
你可以覆盖它
updateService.getUpdate = jasmine.createSpy().and.returnValue(etc)
您可以覆盖间谍的 return 值
var deferred = $q.defer();
deferred.resolve( data1 );
var getUpdateSpy = spyOn(updateService, 'getUpdate').and.returnValue(deferred.promise);
var newDeferred = $q.defer();
newDeferred.resolve( data2 );
getUpdateSpy.and.returnValue(newDeferred.promise);
绿色复选标记的答案对我不起作用,但这确实有效:
yourCoolService.createThing = jasmine.createSpy('notreal', function(){}).and.returnValue();
你的 jasmine 测试会 运行 但是当你启动你的应用程序时,如果你不把一个随机字符串和一个空函数作为参数给 createSpy()
.
更简单更简单的方法:
updateService.getUpdate.and.returnValue(Observable.of({status:true}));
它将return值。
自 jasmine v2.5 起,使用全局 allowRespy()
设置。
jasmine.getEnv().allowRespy(true);
当您不想 and/or 访问第一个间谍时,您可以多次调用 spyOn()
。当心它会 return 之前的间谍,如果有任何已经激活的话。
spyOn(updateService, 'getUpdate').and.returnValue(deferred.promise);
...
spyOn(updateService, 'getUpdate').and.returnValue(deferred.promise);
另一个选项:
(yourService.method as jasmine.Spy).and.returnValue(value);
AngularJS v1.2.26
茉莉花 v2.2.0
如何更改或删除 spyOn
的行为?当我尝试覆盖它时,出现以下错误:Error: getUpdate has already been spied upon
var data1 = 'foo';
var data2 = 'bar';
describe("a spec with a spy", function(){
beforeEach(module('app'));
var $q;
beforeEach(inject(function(_updateService_, _$q_){
updateService = _updateService_;
//spy the results of the getUpdate()
$q = _$q_;
var deferred = $q.defer();
deferred.resolve( data1 );
spyOn(updateService, 'getUpdate').and.returnValue(deferred.promise);
}));
describe('and here the spy should be different', function() {
it('returns a different value', function() {
var deferred = $q.defer();
deferred.resolve( data2 );
spyOn(updateService, 'getUpdate'); //ERROR HERE
updateService.getUpdate.and.returnValue(deferred.promise);
...
});
});
...
当我删除第二个 spyOn 时,测试不起作用。
我该怎么做?
你可以覆盖它
updateService.getUpdate = jasmine.createSpy().and.returnValue(etc)
您可以覆盖间谍的 return 值
var deferred = $q.defer();
deferred.resolve( data1 );
var getUpdateSpy = spyOn(updateService, 'getUpdate').and.returnValue(deferred.promise);
var newDeferred = $q.defer();
newDeferred.resolve( data2 );
getUpdateSpy.and.returnValue(newDeferred.promise);
绿色复选标记的答案对我不起作用,但这确实有效:
yourCoolService.createThing = jasmine.createSpy('notreal', function(){}).and.returnValue();
你的 jasmine 测试会 运行 但是当你启动你的应用程序时,如果你不把一个随机字符串和一个空函数作为参数给 createSpy()
.
更简单更简单的方法:
updateService.getUpdate.and.returnValue(Observable.of({status:true}));
它将return值。
自 jasmine v2.5 起,使用全局 allowRespy()
设置。
jasmine.getEnv().allowRespy(true);
当您不想 and/or 访问第一个间谍时,您可以多次调用 spyOn()
。当心它会 return 之前的间谍,如果有任何已经激活的话。
spyOn(updateService, 'getUpdate').and.returnValue(deferred.promise);
...
spyOn(updateService, 'getUpdate').and.returnValue(deferred.promise);
另一个选项:
(yourService.method as jasmine.Spy).and.returnValue(value);