使用Jasmine进行角度单元测试:如何删除或修改spyOn

eme*_*his 51 javascript unit-testing jasmine angularjs karma-jasmine

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

          ...

        });
    });

...
Run Code Online (Sandbox Code Playgroud)

当我删除第二个spyOn时,测试不起作用.

我该怎么做呢?

Pet*_*ell 68

你可以覆盖它

updateService.getUpdate = jasmine.createSpy().and.returnValue(etc)
Run Code Online (Sandbox Code Playgroud)

  • @Jan如果我有五十个测试,并且其中只有一个有一个与其他测试不同的函数的间谍,我宁愿只改变它一次而不是每一次测试. (10认同)
  • 有没有办法完全删除间谍?要回到原来的功能? (4认同)
  • 最大的问题是,如果你在每个测试中都没有相同的功能,为什么还要有全局间谍呢?如果要为每个测试设置间谍,请为每个测试设置间谍. (4认同)

小智 23

您可以覆盖间谍的返回值

    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);        
Run Code Online (Sandbox Code Playgroud)


And*_*ang 14

Since jasmine v2.5, use the global allowRespy() setting.

jasmine.getEnv().allowRespy(true);
Run Code Online (Sandbox Code Playgroud)

You'll be able to call spyOn() multiple times, when you don't want and/or have access to the first spy. Beware it will return the previous spy, if any is already active.

spyOn(updateService, 'getUpdate').and.returnValue(deferred.promise);
...
spyOn(updateService, 'getUpdate').and.returnValue(deferred.promise);
Run Code Online (Sandbox Code Playgroud)


Jus*_*tas 6

另外一个选项:

(yourService.method as jasmine.Spy).and.returnValue(value);
Run Code Online (Sandbox Code Playgroud)


Ani*_*Das 5

更简单的方法就是简单

updateService.getUpdate.and.returnValue(Observable.of({status:true}));
Run Code Online (Sandbox Code Playgroud)