2012-10-10 14 views
12

मैंने नीचे दिखाए गए मेरे आवेदन के लिए डेटाबेस रैपर बनाया है। इसका परीक्षण करने के लिए, मैं स्पष्ट रूप से वास्तविक डेटाबेस लाइब्रेरी को प्रतिस्थापित करना चाहता हूं। मैं एक नई कक्षा बना सकता हूं जो query विधि को झुकाता है और वहां सभी इनपुट पकड़ता है, लेकिन sinon.js का उपयोग करके अधिक उपयुक्त लगता है, लेकिन मैं इसका उपयोग कैसे करूं?
sinon.js की mock या stub सुविधाओं है कि मैं क्या उपयोग करना चाहिए?sinon.js में एक वर्ग को दबाकर और/या मजाक कर रहे हैं?

wrapper = (function() { 

    function wrapper() {} 

    wrapper.db = require("database"); 

    wrapper.prototype.insertUser = function(doc) { 
    return this.db.query("INSERT INTO USERS..."); 
    }; 

    return wrapper; 

})(); 

उत्तर

6

आप इसके लिए दोनों का उपयोग कर सकते हैं।

नकली एक अपेक्षित आदेश दिया गया व्यवहार है कि, यदि सही तरीके से पालन नहीं किया गया है, तो आपको एक त्रुटि देने जा रहा है।

स्टब एक नकली के समान है, लेकिन आदेश के बिना, ताकि आप अपनी विधियों को अपनी इच्छानुसार कॉल कर सकें। मेरे अनुभव में आपको लगभग नकली की आवश्यकता नहीं है।

उनमें से दोनों खाली विधि के लिए आपकी विधि को प्रतिस्थापित करेंगे, या एक बंद होने पर बंद हो जाएंगे। वह कुछ इस तरह होगा:

stub = sinon.stub(wrapper , 'insertUser ', function() { return true; }); 

तो फिर तुम जोड़ने अगर यह हुआ था कि व्यवहार की जांच करने की उम्मीद है।

मैं परीक्षण की जाँच के लिए Jasmine-Sinon साथ Jasmine का उपयोग करना चाहते।

+0

ओह। तो 'insertUser'' कॉल के बजाय 'insertUser' विधि को स्टब करना बेहतर होगा जो 'insertUser' करता है? – Industrial

+2

आप जो परीक्षण कर रहे हैं उस पर निर्भर करता है, लेकिन यदि आप परीक्षण करना चाहते हैं कि डीबी में डालने वाला यूज़र डालने वाला है तो यह एकीकरण परीक्षण होगा और कोई स्टबिंग आपको वास्तविक तर्क का उपयोग करने से बचाएगा, कुछ मेमोरी डीबी में "नकली" ओरेकल उदाहरण के लिए, यदि आप परीक्षण करना चाहते हैं कि यदि आवश्यक हो तो insertUser को कॉल किया जाता है तो insertUser विधि को दबाकर इसे करने का एक तरीका हो सकता है ... –

8

पहले, मैं अपनी कक्षा परिभाषा थोड़ा संशोधित (अपरकेस वर्ग के नाम और डाटाबेस काम ठीक) चाहते हैं:

var WrapperStub = sinon.spy(function() { 
    return sinon.createStubInstance(Wrapper); 
}); 

sinon.createStubInstance एक उदाहरण बना देगा:

var Wrapper = (function() { 

    function Wrapper() { 
    this.db = require("database"); 
    } 

    Wrapper.prototype.insertUser = function(doc) { 
    return this.db.query("INSERT INTO USERS..."); 
    }; 

    return Wrapper; 

})(); 

पूरी कक्षा ठूंठ रैपर का जहां हर विधि एक स्टब है। sinon.spy हमें क्लास इंस्टेंटेशन की जासूसी करने की अनुमति देगा।

तो आप इसे इस प्रकार का प्रयोग कर सकते हैं:

// verify instantiation 
var wrapper = new WrapperStub(); 
expect(WrapperStub).to.have.been.calledWithNew; 

// verify method stub 
wrapper.insertUser.returns('data'); 
expect(wrapper.insertUser()).to.equal('data'); 
expect(wrapper.insertUser).to.have.been.calledOnce; 

(कथनों chai और sinon-chai का उपयोग करें) मैंने कहा कि बस "यह व्यायाम" क्योंकि इस कोड स्निपेट एक वास्तविक इकाई परीक्षण नहीं है। इंस्टेंटेशन और विधि कॉल आपके विषय द्वारा परीक्षण के तहत किए जाएंगे।

अब, आप किसी निर्भरता द्वारा इंजेक्शन नकली करना चाहते हैं की आवश्यकता होती है() -such अपने उदाहरण में db = require('database') के रूप में, आप या तो Jest (लेकिन उपयोग नहीं कर सिनोन) की तरह एक परीक्षण उपकरण या sinonquire जो मैं से प्रेरित बनाया की कोशिश कर सकते जेस्ट लेकिन इसे साइनऑन के साथ अपने पसंदीदा परीक्षण उपकरण (मेरा मोचा) के साथ उपयोग करने के लिए है। आंतरिक रूप से, sinonquire कक्षा को स्टब करने के लिए sinon.spy और sinon.createStubInstance के संयोजन के ऊपर दिखाए गए एक ही तकनीक का उपयोग करता है।

+0

जेस्ट के अपडेट किए गए लिंक: https://facebook.github.io/jest/docs/mock -functions.html http://facebook.github.io/jest/docs/jest-object.html#jestenableautomock – jwadsack