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);
...
});
});
...
2番目のspyOnを削除すると、テストは機能しません。
どうすればいいですか?
上書きできます
updateService.getUpdate = jasmine.createSpy().and.returnValue(etc)
スパイの戻り値をオーバーライドできます
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);
ジャスミンv2.5以降、グローバルallowRespy()
設定を使用します。
jasmine.getEnv().allowRespy(true);
最初のスパイにアクセスしたくない場合やアクセスできない場合は、spyOn()
を複数回呼び出すことができます。既にアクティブになっている場合、以前のスパイが返されることに注意してください。
spyOn(updateService, 'getUpdate').and.returnValue(deferred.promise);
...
spyOn(updateService, 'getUpdate').and.returnValue(deferred.promise);
より簡単な方法はシンプルにすることです
updateService.getUpdate.and.returnValue(Observable.of({status:true}));
緑色のチェックマークが付いた答えは私にはうまくいきませんでしたが、これはうまくいきました:
_yourCoolService.createThing = jasmine.createSpy('notreal', function(){}).and.returnValue();
_
ジャスミンテストは実行されますが、createSpy()
の引数としてランダムな文字列と空の関数を配置しないと、アプリを起動するときにTypeScriptが大声で叫びます。
別のオプション:
(yourService.method as jasmine.Spy).and.returnValue(value);