2015-03-02 39 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 2015-03-04 19:52:31

+4

最大的問題是,如果你在每個測試中都沒有相同的功能,爲什麼要有全球間諜呢?如果你想爲每個測試設置一個間諜,那麼爲每個測試設置一個間諜。 – Jan 2015-07-06 21:07:56

+6

@Jan如果我有五十個測試,並且只有其中一個人有一個與其他人不同的功能的間諜,我寧願只改變一次,而不是每一次測試。 – theblang 2016-05-18 19:57:27

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 2018-02-01 13:22:35

2

綠色檢查標記的回答並沒有爲我工作的返回值,但這並:

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

你的茉莉花測試會運行,但是當你打開你的應用程序打字稿時,會大聲地吼你,如果你不'把一個隨機的字符串和一個空的函數作爲參數createSpy()

+1

這可能是由於Jasmine的更新版本。我使用2.7,這對我有用。 – MBielski 2017-08-30 17:21:31

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