2009-07-10 23 views
12

मैं NMock2 उपयोग करते हैं, और मैं निम्नलिखित NMock कक्षाओं का मसौदा तैयार किया गया है कुछ सामान्य नकली ढांचे अवधारणाओं का प्रतिनिधित्व करने के लिए:कब और कब स्टब करना है?

  • Expect: इस निर्दिष्ट करता है जो एक मज़ाक उड़ाया विधि लौटना चाहिए और कहता है कि कॉल होने चाहिए या परीक्षण विफल रहता है (जब VerifyAllExpectationsHaveBeenMet() पर कॉल के साथ)।

  • Stub: यह निर्दिष्ट करता है कि एक मॉक विधि को वापस क्यों करना चाहिए लेकिन परीक्षण विफल होने का कारण नहीं बन सकता है।

तो मुझे कब करना चाहिए?

+0

उम्मीद कुछ भी वापस नहीं लौटाएगी, जबकि स्टब आपके द्वारा निर्दिष्ट किए गए कार्यों को वापस कर देगा। एक अच्छा उपयोग केस के लिए – zinking

उत्तर

15

मजाक चौखटे मुद्दा यह है कि वे कार्यात्मक रूप में माना जा सकता करने के लिए mocks की अवधारणाओं & स्टब्स करीब & करीब ला रहे हैं एक साथ बहुत सारे लगभग एक जैसा।

  • नकली: एक वैचारिक परिप्रेक्ष्य तथापि से, मैं आमतौर पर इस सम्मेलन पालन करने की कोशिश केवल जब आप स्पष्ट रूप से परीक्षण के अंतर्गत वस्तु के व्यवहार को सत्यापित करने के लिए कोशिश कर रहे हैं (यानी अपने परीक्षण कह रही है कि इस वस्तु को कॉल करना होगा वह वस्तु)।
  • स्टब: जब आप कुछ कार्यक्षमता/व्यवहार का परीक्षण करने की कोशिश कर रहे हैं, लेकिन काम करने के लिए आपको कुछ बाहरी वस्तुओं पर भरोसा करना होगा (यानी आपका परीक्षण कह रहा है कि इस वस्तु को कुछ करना चाहिए, लेकिन एक तरफ प्रभाव, यह उस ऑब्जेक्ट को कॉल कर सकता है)

यह स्पष्ट हो जाता है जब आप सुनिश्चित करते हैं कि आपके प्रत्येक इकाई परीक्षण केवल एक चीज का परीक्षण करते हैं। निश्चित रूप से यदि आप एक परीक्षण में सब कुछ परीक्षण करने का प्रयास करते हैं तो आप सबकुछ की उम्मीद कर सकते हैं। लेकिन केवल उन चीजों की अपेक्षा करके जो विशिष्ट इकाई परीक्षण की जांच कर रहे हैं, आपका कोड बहुत स्पष्ट है क्योंकि आप एक नज़र में देख सकते हैं कि परीक्षण का उद्देश्य क्या है।

इसका एक अन्य लाभ यह है कि आप परिवर्तन से थोड़ा अधिक इन्सुलेट हो जाएंगे & जब कोई परिवर्तन ब्रेक का कारण बनता है तो बेहतर त्रुटि संदेश प्राप्त होता है। दूसरे शब्दों में यदि आप अपने कार्यान्वयन के कुछ हिस्सों को बदलते हैं, तो आपको केवल एक परीक्षण केस तोड़ने की अधिक संभावना होती है, जो आपको & तोड़ने वाले परीक्षणों के पूरे सूट के बजाए बिल्कुल सही दिखाएगा, जो सिर्फ शोर बना रहा है।

संपादित: यह एक काल्पनिक उदाहरण के आधार पर स्पष्ट हो सकता है, जहां एक कैलकुलेटर वस्तु एक डेटाबेस के लिए सभी अतिरिक्त ऑडिट (छद्म कोड में) ...

public void CalculateShouldAddTwoNumbersCorrectly() { 
    var auditDB = //Get mock object of Audit DB 
    //Stub out the audit functionality... 
    var calculator = new Calculator(auditDB); 
    int result = calculator.Add(1, 2); 
    //assert that result is 3 
} 

public void CalculateShouldAuditAddsToTheDatabase() { 
    var auditDB = //Get mock object of Audit DB 
    //Expect the audit functionality... 
    var calculator = new Calculator(auditDB); 
    int result = calculator.Add(1, 2); 
    //verify that the audit was performed. 
} 
पहला परीक्षण मामले में

तो हम Add विधि & की कार्यक्षमता का परीक्षण कर रहे हैं, इस पर ध्यान न दें कि कोई ऑडिट ईवेंट होता है या नहीं, लेकिन हमें पता चल जाता है कि कैलकुलेटर ऑडिट डीबी संदर्भ के साथ काम नहीं करेगा, इसलिए हम इसे न्यूनतम करने के लिए बस इसे बाहर निकाल दें हमारे विशिष्ट परीक्षण मामले काम करने के लिए कार्यक्षमता की।दूसरे परीक्षण में हम विशेष रूप से परीक्षण कर रहे हैं कि जब आप Add करते हैं, तो ऑडिट ईवेंट होता है, इसलिए यहां हम अपेक्षाओं का उपयोग करते हैं (ध्यान दें कि हम नतीजे भी नहीं देखते हैं कि परिणाम क्या है, क्योंकि यह हम परीक्षण नहीं कर रहे हैं)।

हाँ आप दोनों मामलों को एक, & में जोड़ सकते हैं और उम्मीद करते हैं कि आपका परिणाम 3 है, लेकिन फिर आप एक इकाई परीक्षण में दो मामलों का परीक्षण कर रहे हैं। इससे आपके परीक्षण अधिक भंगुर हो जाएंगे (क्योंकि चीजों का एक बड़ा सतह क्षेत्र परीक्षण को तोड़ने के लिए बदल सकता है) और कम स्पष्ट (जब विलय परीक्षण विफल रहता है तो यह तुरंत स्पष्ट नहीं होता कि समस्या क्या है .. क्या अतिरिक्त काम नहीं कर रहा है, या ऑडिट काम नहीं कर रहा है?)

+0

मुझे यकीन नहीं है कि यह अन्य मॉकिंग फ्रेमवर्क के साथ कैसे है, लेकिन एनएमॉक के साथ, यदि आप एक अपेक्षा की जांच करना शुरू करते हैं, तो आप * सभी * बाहरी कॉल के लिए हुक पर हैं, जो कभी-कभी एक क्रशिंग बोझ बनाता है। मुझे एहसास है कि यह आवश्यकता हमें बेहतर डिजाइन की ओर धकेलती है, लेकिन कई मामलों में, मैं विरासत कोड के लिए यूनिट परीक्षण लिखना चाहता हूं जहां मुझे जहाज भेजने से पहले उस समय बहुत अधिक रिफैक्टरिंग करने का जोखिम नहीं उठा सकता। –

+2

हम्म ... इससे कोई फर्क पड़ता है। मैंने मुख्य रूप से राइनोमोक्स का उपयोग किया है, जो आपको एक विधि की अपेक्षा करने और फिर दूसरों को स्टब करने की अनुमति देता है। मेरे अंक अभी भी खड़े हैं (मेरा जोड़ा उदाहरण देखें), लेकिन आपके मामले में, मुझे लगता है कि आपको एक परीक्षण में अपनी सभी उम्मीद आधारित परीक्षण (यानी व्यवहार परीक्षण) करने की आवश्यकता होगी। – Alconja

+0

एएके, मुझे स्पष्टीकरण देना चाहिए था (और शायद मेरे प्रश्न के शरीर में इसका उल्लेख करना चाहें): आप एनएमॉक में उम्मीदों और स्टब्स को भी मिश्रण कर सकते हैं। समस्या यह है कि अक्सर मैं केवल एक उम्मीद निर्दिष्ट करना चाहता हूं कि बाकी को भी रोकना न पड़े (फिर भी, यह विशेष रूप से सच है जब मैं कोड से निपट रहा हूं जो एक अच्छी ठोस पुन: वास्तुकला का उपयोग कर सकता है - जब कई छिपे होते हैं बाहरी कॉल की परतें)। ओह, और +1। –

1

अच्छा ... IMHO यह आसान नहीं हो सकता है: यदि आपका परीक्षण यह सुनिश्चित करने के बारे में है कि आपका प्रेजेंटर सेव कॉल करेगा, तो एक उम्मीद करें। यदि आपका परीक्षण यह सुनिश्चित करने के बारे में है कि आपका प्रेजेंटर अपवाद को व्यवस्थित तरीके से संभाल लेगा यदि सहेजें फेंकता है, तो स्टब करें।

अधिक जानकारी के लिए this podcast by Hanselman and Osherove (इकाई परीक्षण का कला के लेखक) की जाँच

+0

+1 एक बार विधि दोनों 'स्टब' विधि, हालांकि यह बहुत संकीर्ण है - मुझे लगता है कि सवाल अभी भी थोड़ा सा सरल हो सकता है। –

+0

ठीक है। यदि आप जोर देते हैं कि मैं बच्चे को खिलाने वाला हूं :) यूनिट-टेस्ट केवल एक चीज का परीक्षण करना चाहिए। कभी दो नहीं यह या तो परीक्षण करना चाहिए कि क्या SUT (सिस्टम अंडर टेस्ट) ठीक से कुछ क्रियाओं को अपनी निर्भरताओं में से एक को सौंपता है। या यह जांच करनी चाहिए कि क्या एक निर्भरता द्वारा लौटाए गए परिणाम के लिए सही ढंग से प्रतिक्रिया करता है। यदि पहले, मॉक का उपयोग करें। यदि दूसरा, स्टब का उपयोग करें। यदि संदेह है, तो हीरे के जैक का उपयोग करें। – zvolkov

4

"कार्रवाई की अपेक्षा करें, प्रश्न पूछें"। यदि कॉल को ऑब्जेक्ट के बाहर ऑब्जेक्ट के बाहर दुनिया की स्थिति बदलनी चाहिए, तो इसे एक उम्मीद करें - आपको इसकी परवाह है कि इसे कैसे कहा जाता है। यदि यह सिर्फ एक प्रश्न है, तो आप सिस्टम की स्थिति को बदले बिना इसे एक या छह बार कॉल कर सकते हैं, फिर कॉल को दबाएं।

एक और बात, ध्यान दें कि भेद स्टब्स और अपेक्षाओं के बीच है, यह व्यक्तिगत कॉल है, जरूरी नहीं कि पूरी वस्तुएं हों।

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