web-dev-qa-db-ja.com

Angular Jasmineによる単体テスト: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);

          ...

        });
    });

...

2番目のspyOnを削除すると、テストは機能しません。

どうすればいいですか?

47
emersonthis

上書きできます

updateService.getUpdate = jasmine.createSpy().and.returnValue(etc)
62
Peter Ashwell

スパイの戻り値をオーバーライドできます

    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);        
22

ジャスミンv2.5以降、グローバルallowRespy()設定を使用します。

jasmine.getEnv().allowRespy(true);

最初のスパイにアクセスしたくない場合やアクセスできない場合は、spyOn()を複数回呼び出すことができます。既にアクティブになっている場合、以前のスパイが返されることに注意してください。

spyOn(updateService, 'getUpdate').and.returnValue(deferred.promise);
...
spyOn(updateService, 'getUpdate').and.returnValue(deferred.promise);
8
André Werlang

より簡単な方法はシンプルにすることです

updateService.getUpdate.and.returnValue(Observable.of({status:true}));
3
Aniruddha Das

緑色のチェックマークが付いた答えは私にはうまくいきませんでしたが、これはうまくいきました:

_yourCoolService.createThing = jasmine.createSpy('notreal', function(){}).and.returnValue();
_

ジャスミンテストは実行されますが、createSpy()の引数としてランダムな文字列と空の関数を配置しないと、アプリを起動するときにTypeScriptが大声で叫びます。

2
rb1econ

別のオプション:

(yourService.method as jasmine.Spy).and.returnValue(value);
0
Justas