Угловое модульное тестирование с помощью 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);

          ...

        });
    });

...

Когда я удаляю второй spyOn, тест не работает.

Как мне это сделать?

Ответы

Ответ 1

Вы можете просто перезаписать его

updateService.getUpdate = jasmine.createSpy().and.returnValue(etc)

Ответ 2

Вы можете переопределить возвращаемое значение шпиона

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

Ответ 3

Начиная с жасмина v2.5, используйте глобальную allowRespy().

jasmine.getEnv().allowRespy(true);

Ответ 4

Более простой способ - простой

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

Ответ 5

зеленый контрольный ответ не работал для меня, но это произошло:

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

ваш тест на жасмин будет работать, но когда вы пойдете, чтобы запустить приложение, скрипт будет громко кричать на вас, если вы не ставите случайную строку и пустую функцию в качестве аргументов createSpy().

Ответ 6

Другой вариант:

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