2015-03-02 4 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

@ जैन यदि मेरे पास पचास परीक्षण हैं, और उनमें से केवल एक को एक समारोह के लिए एक जासूसी है जो बाकी से अलग है, तो मैं इसे सिर्फ एक ही परीक्षण के बजाय एक बार बदल दूंगा। – 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

हरे चेक से चिह्नित जवाब मेरे लिए काम नहीं किया की वापसी मान ओवरराइड कर सकते हैं के ऊपर लिख सकते हैं, लेकिन ऐसा किया:

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

आपका जैस्मीन परीक्षण चलाएगा, लेकिन जब आप आग लग जाएंगे तो आपकी ऐप टाइपस्क्रिप्ट आपके ऊपर जोर से चिल्लाएगी यदि आप ' createSpy() पर तर्क के रूप में एक यादृच्छिक स्ट्रिंग और एक खाली फ़ंक्शन डालें।

+1

यह शायद जैस्मीन के एक अद्यतन संस्करण के कारण है। मैं 2.7 का उपयोग कर रहा हूं और यह मेरे लिए काम करता है। – MBielski

0

अधिक आसान तरीका चमेली v2.5 के बाद से सरल

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

के लिए है, वैश्विक allowRespy() सेटिंग का उपयोग करें।

jasmine.getEnv().allowRespy(true);

आप spyOn() कई बार फोन करने के लिए जब आप यह चाहते हैं और/या पहले जासूस की पहुंच है सकेंगे। सावधान रहें कि यह पिछले जासूस को वापस कर देगा, अगर कोई पहले से सक्रिय है।

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

संबंधित मुद्दे