2015-03-02 3 views
27

AngularJS v1.2.26Угловая модульное тестирование с Жасмин: как удалить или изменить spyOn

Жасмин 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 тест не работает.

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

ответ

44

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

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

Есть ли способ, чтобы удалить шпиона полностью? Чтобы вернуться к исходной функции? – emersonthis

+4

Большой вопрос: если у вас нет одинаковой функциональности в каждом тесте, зачем вообще глобальный шпион? Если вы хотите установить шпион для каждого теста, установите шпион для каждого теста. – Jan

+6

@Jan Если у меня пятьдесят тестов, и только один из них имеет шпион для функции, отличной от остальных, я бы скорее просто изменил ее один раз там, а не каждый тест. – theblang

14

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

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

когда у меня есть несколько шпионов, он будет работать? – Lijo

2

зеленый чек обозначенным ответ не работает для меня, но это сделал:

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

+1

Возможно, это связано с обновленной версией Jasmine. Я использую 2,7, и это работает для меня. – MBielski

0

Более простой способ заключается в простой

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

С жасмином v2.5, использовать глобальную allowRespy() установку.

jasmine.getEnv().allowRespy(true);

Вы будете в состоянии назвать spyOn() несколько раз, когда вы не хотите, и/или иметь доступ к первому шпиону. Помните, что он вернет предыдущего шпиона, если он уже активен.

spyOn(updateService, 'getUpdate').and.returnValue(deferred.promise); 
 
... 
 
spyOn(updateService, 'getUpdate').and.returnValue(deferred.promise);

Смежные вопросы