2012-02-19 16 views
47

का उपयोग कर एक कन्स्ट्रक्टर पर जासूसी मैं जैस्मीन का उपयोग करके परीक्षण कर रहा हूं कि कुछ वस्तुएं बनाई गई हैं और उन पर विधियों को बुलाया जाता है।जैस्मीन

मेरे पास एक jQuery विजेट है जो फ्लिपकॉन्टर ऑब्जेक्ट बनाता है और उन पर सेट वैल्यू विधि को कॉल करता है। flipcounter के लिए कोड यहाँ है: https://bitbucket.org/cnanney/apple-style-flip-counter/src/13fd00129a41/js/flipcounter.js

flipcounters का उपयोग कर बनाई गई हैं:

var myFlipCounter = new flipCounter("counter", {inc: 23, pace: 500}); 

मैं परीक्षण करने के लिए है कि flipcounters बनाई गई हैं और setValue विधि उन पर कहा जाता है चाहता हूँ। मेरी समस्या यह है कि मैं इन वस्तुओं पर बनाये जाने से पहले भी कैसे जासूसी कर सकता हूं? क्या मैं निर्माता पर जासूसी करता हूं और नकली वस्तुओं को वापस करता हूं? नमूना कोड वास्तव में मदद करेगा। आपकी सहायताके लिए धन्यवाद! :)

अद्यतन:

myStub = jasmine.createSpy('myStub'); 
spyOn(window, 'flipCounter').andReturn(myStub); 

//expectation 
expect(window.flipCounter).toHaveBeenCalled(); 

फिर flipCounter द्वारा setValue कॉल के लिए परीक्षण:

spyOn(myStub, 'setValue'); 

//expectation 
expect(myStub.setValue).toHaveBeenCalled(); 

पहले

मैं इस तरह flipCounter पर जासूसी की कोशिश की है फ्लिप काउंटर शुरू करने के लिए परीक्षण ठीक है, लेकिन सेटवैल्यू कॉल का परीक्षण करने के लिए, मुझे बस एक 'setValue() विधि मौजूद नहीं है' त्रुटि। क्या मैं इसे सही तरीके से कर रहा हूं? धन्यवाद!

+0

कारण आप उस पर 'जासूस' करना चाहते हैं क्या है? –

+1

मैं यह सुनिश्चित करना चाहता हूं कि फ्लिप काउंटर बनाया गया है और उचित मूल्य निर्धारित है। – maru

उत्तर

37

flipCounter एक और कार्य है, भले ही यह किसी ऑब्जेक्ट को बनाने के लिए भी होता है। इसलिए आप कर सकते हैं:

var cSpy = spyOn(window, 'flipCounter'); 

उस पर उस पर एक जासूस प्राप्त करने के लिए, और कर निरीक्षण के सभी प्रकार या कहते हैं:

var cSpy = spyOn(window, 'flipCounter').andCallThrough(); 
var counter = flipCounter('foo', options); 
expect(cSpy).wasCalled(); 

हालांकि, इस overkill लगता है।यह करने के लिए पर्याप्त होगा:

var myFlipCounter = new flipCounter("counter", options); 
expect(myFlipCounter).toBeDefined(); 
expect(myFlipCounter.getValue(foo)).toEqual(bar); 
+0

किसी जासूस पर कोई जासूसी नहीं करना अच्छा विचार नहीं है;) मैं या तो ऊपर उठाए गए दूसरे दृष्टिकोण का उपयोग करूंगा , सेट वैल्यू पर अलग-अलग परीक्षण और जासूसी सुनिश्चित करने के लिए कि यह भी काम करता है। – ggozad

+0

किसी भी मामले में जब आप spyOn (विंडो, 'फ्लिप काउंटर') करते हैं। और रीटर्न (myStub); आपने अपने कन्स्ट्रक्टर को कुछ ऐसा किया है जो कुछ भी नहीं करता है। परीक्षण करने के दौरान आपको या तो कन्स्ट्रक्टर के माध्यम से कॉल या दोहराना होगा। – ggozad

+0

यदि आप बस इतना करना चाहते हैं कि सेट वैल्यू को बुलाया गया था, तो कन्स्ट्रक्टर पर जासूसी न करें। इसके बजाय setValue पर जासूसी (और कॉलथ्रू())। फिर आप जांच सकते हैं कि इसे बुलाया गया था, इसके तर्कों की जांच करें, और अभी भी ऑब्जेक्ट है। – ggozad

-2

यह नहीं पता कि जैस्मीन मैक्स का उपयोग करके इसे कैसे किया जाए, लेकिन यदि आप शक्तिशाली मॉकिंग/जासूस/स्टब्स चाहते हैं तो मैं sinon.js की सिफारिश करता हूं, जो जैस्मीन के साथ बहुत अच्छी तरह से काम करता है।

डॉक्स से:

एक परीक्षण जासूस एक समारोह है कि तर्क, वापसी मान को रिकॉर्ड कर, अपने सभी कॉल के लिए इस बात का मूल्य और अपवाद उत्पन्न (यदि हो तो) है। एक परीक्षण जासूस एक अज्ञात कार्य हो सकता है या यह एक मौजूदा फ़ंक्शन को लपेट सकता है।

मोजे (और नकली उम्मीदें) प्री-प्रोग्राम किए गए व्यवहार (जैसे स्टब्स) के साथ-साथ पूर्व-प्रोग्राम किए गए अपेक्षाओं के साथ नकली विधियां (जासूसों की तरह) हैं। एक नकली आपके परीक्षण में विफल हो जाएगी यदि इसका उपयोग के रूप में नहीं किया जाता है।

sinon.js के साथ आप flipCounter निर्माता है कि एक और जासूस रिटर्न की एक नकली बना सकते हैं।

फिर जोर दें कि कन्स्ट्रक्टर को creatorMock.calledWithNew() का उपयोग करके बुलाया गया था, और जोर देकर कहा कि लौटा हुआ जासूस वापसSpySpy.called के साथ बुलाया गया था (arg1, arg2 ...)।

+4

जैस्मीन के सक्षम मैक्स में निर्मित होने पर अतिरिक्त लाइब्रेरी का उपयोग करने की आवश्यकता नहीं है। Sinon.js अन्य चीजों के लिए उपयोगी है हालांकि – sMoZely

3

निम्नलिखित 'विंडो' पर भरोसा नहीं करता है। कहते हैं कि चलो इस कोड को आप परीक्षण करना चाहते है -

function startCountingFlips(flipCounter) { 
    var myFlipCounter = new flipCounter("counter", {inc: 23, pace: 500}); 
} 

आपका परीक्षण किया जा सकता है -

var initSpy = jasmine.createSpy('initFlipCounter'); 
var flipCounter = function(id, options) { 
    initSpy(id, options); 
} 
startCountingFlips(flipCounter); 
expect(initSpy).toHaveBeenCalledWith("counter", {inc:23, pace:500}); 
4

आपको लगता है कि एक जासूस कार्य करने के लिए setValue संपत्ति सेट flipCounter के लिए एक नकली निर्माता को लागू करने की है। मान लीजिए कि समारोह आप परीक्षण करना चाहते यह है दो:

function flipIt() { 
    var myFlipCounter = new flipCounter("counter", {inc: 23, pace: 500}); 
    myFlipCounter.setValue(100); 
} 

आपका कल्पना इस तरह दिखना चाहिए:

describe('flipIt', function() { 
    var setValue; 
    beforeEach(function() { 
    setValue = jasmine.createSpy('setValue'); 
    spyOn(window, 'flipCounter').and.callFake(function() { 
     this.setValue = setValue; 
    }); 
    flipIt(); 
    }); 
    it('should call flipCounter constructor', function() { 
    expect(window.flipCounter) 
     .toHaveBeenCalledWith("counter", {inc: 23, pace: 500}); 
    }); 
    it('should call flipCounter.setValue', function() { 
    expect(setValue).toHaveBeenCalledWith(100); 
    }); 
}); 
10

मैं jasmine.createSpyObj() उपयोग करने का सुझाव होगा जब आप गुण जासूसी करने की आवश्यकता है के साथ वस्तुओं नकली करना चाहते हैं पर।

myStub = jasmine.createSpyObj('myStub', ['setValue']); 
spyOn(window, 'flipCounter').andReturn(myStub); 

यह उम्मीद flipCounter इंटरफेस के साथ बातचीत का परीक्षण करती है, flipCounter क्रियान्वयन के आधार पर बिना।

+1

मैं इस जवाब को @ ggozad के उत्तर से अधिक पसंद करता हूं, क्योंकि यह परीक्षणों से अलग बाहरी मॉड्यूल रखता है और विशेष रूप से उदाहरण-जैसी वस्तुओं को मजाक करने के लिए डिज़ाइन की गई एक अंतर्निहित चमेली उपयोगिता का उपयोग करता है। –

0

मेरे एक निर्माता का परीक्षण करने के संस्करण प्रोटोटाइप पर जासूसी करने के लिए है:

spyOn(flipCounter.prototype, 'setValue').and.callThrough(); 
var myFlipCounter = new flipCounter("counter", {inc: 23, pace: 500}); 
expect(flipCounter.prototype.setValue).toHaveBeenCalledTimes(1); 
+0

अच्छा, धन्यवाद। यह 'XMLHttpRequest' –

+0

जैसे अंतर्निर्मित ऑब्जेक्ट्स के साथ पूरी तरह से काम करता है AJAX mockup के लिए मैं इसका उपयोग करता हूं: https://jasmine.github.io/2.2/ajax.html – Holger

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