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

时间:2015-03-02 23:41:11

标签: javascript angularjs unit-testing jasmine 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);

          ...

        });
    });

...

当我删除第二个间谍时,测试无效。

我该怎么做?

6 个答案:

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