AngularJS v1.2.26
Jasmine 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);
...
});
});
...
当我删除第二个间谍时,测试无效。
我该怎么做?
答案 0 :(得分:59)
你可以覆盖它
updateService.getUpdate = jasmine.createSpy().and.returnValue(etc)
答案 1 :(得分:21)
您可以覆盖间谍的返回值
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);
答案 2 :(得分:4)
自jasmine v2.5起,请使用全局allowRespy()
设置。
jasmine.getEnv().allowRespy(true);

当您不想和/或有权访问第一个间谍时,您可以多次致电spyOn()
。请注意,如果有任何已经激活的间谍,它将返回上一个间谍。
spyOn(updateService, 'getUpdate').and.returnValue(deferred.promise);
...
spyOn(updateService, 'getUpdate').and.returnValue(deferred.promise);

答案 3 :(得分:3)
更简单的方法是简单
updateService.getUpdate.and.returnValue(Observable.of({status:true}));
答案 4 :(得分:2)
绿色勾选的答案对我没有用,但是这样做了:
yourCoolService.createThing = jasmine.createSpy('notreal', function(){}).and.returnValue();
你的茉莉花测试会运行,但当你开始点击你的app打字稿时,如果你不把随机字符串和空函数作为createSpy()
的参数,你会大声喊叫。
答案 5 :(得分:0)
另一个选择:
(yourService.method as jasmine.Spy).and.returnValue(value);