राइनो मोक्स पर मोक्स और स्टब्स के बीच अंतर क्या हैं?


149

मैं इसके साथ पर्याप्त रूप से नहीं खेलता हूं और आमतौर पर मोक्स का उपयोग करता हूं, लेकिन मुझे आश्चर्य है कि राइनो मोक्स पर एक या दूसरे का उपयोग करने के लिए इस दो के बीच क्या अंतर हैं।

अपडेट करें:

मुझे अपने सवाल का जवाब भी आयेंदे के शब्दों में मिला :

स्टब्स और मोक्स के बीच का अंतर

आप इस लेख में इन शर्तों की वास्तविक परिभाषा प्राप्त कर सकते हैं: मोक्स स्टब्स नहीं हैं । मैं राइनो मोक्स के दृष्टिकोण से अंतर पर ध्यान देना चाहता हूं।

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

यदि आप परीक्षण के तहत कोड के व्यवहार को सत्यापित करना चाहते हैं, तो आप उचित उम्मीद के साथ एक नकली का उपयोग करेंगे, और इसे सत्यापित करेंगे। यदि आप केवल एक मान पास करना चाहते हैं जिसे एक निश्चित तरीके से कार्य करने की आवश्यकता हो सकती है, लेकिन इस परीक्षण का ध्यान केंद्रित नहीं है, तो आप एक स्टब का उपयोग करेंगे।

महत्वपूर्ण: एक ठूंठ कभी भी परीक्षण में विफल नहीं होगा।


जवाबों:


148

के अनुसार इस

... सीधे शब्दों में कहें तो मॉक और स्टब ऑब्जेक्ट्स के बीच एक अंतर है और राइनोमॉक्स यह स्वीकार करता है कि हमें परीक्षण लिखने की अनुमति देता है जो उनके उद्देश्य को बेहतर ढंग से बताता है।

नकली वस्तुओं का उपयोग अपेक्षाओं को परिभाषित करने के लिए किया जाता है: इस परिदृश्य में मुझे उम्मीद है कि इस तरह के और ऐसे मापदंडों के साथ विधि ए () को बुलाया जाएगा। ऐसी अपेक्षाओं को रिकॉर्ड करता है और सत्यापित करता है।

दूसरी ओर, स्टब्स का एक अलग उद्देश्य होता है: वे अपेक्षाओं को रिकॉर्ड या सत्यापित नहीं करते हैं, बल्कि हमें परीक्षण परिदृश्य का उपयोग करने के लिए "नकली" वस्तु की स्थिति को "प्रतिस्थापित" करने की अनुमति देते हैं ...


मुझे एक और उपयोगी पोस्ट मिली जो इस प्रश्न के लिए स्वीकार किए गए उत्तर के समान संदेश देती है - martinfowler.com/articles/mocksArentStubs.html
सिंह १४६

20

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

स्टब्स

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

mocks

एक मॉक एक कार्यान्वयन के साथ एक स्टब है। यदि परीक्षण के तहत हमारा कार्य हमारी नकली वस्तु के साथ इंटरैक्ट करता है, तो हम सत्यापित कर सकते हैं कि मॉक के साथ बातचीत की गई है जैसा कि हम उम्मीद करते हैं।

उदाहरण के लिए, मान लें कि हमारे पास उपयोगकर्ता की एक नकली चीज़ थी, और हम यह सत्यापित करना चाहते थे कि हमारा सत्र.लॉबिन विधि काम करती है, हम यह जाँचना चाहते हैं कि user.lastLoggedIn सेट किया गया था। हम एक नकली उपयोगकर्ता बना सकते हैं जो इस पद्धति को लागू करता है। जब हम session.login कहते हैं, तो हम यह पुष्टि कर सकते हैं कि user.lastLoggedIn में वह स्थिति है जिसकी हमें उम्मीद थी।

सारांश में

एक मॉक एक कार्यान्वयन के साथ एक स्टब है, जो हमें दुष्प्रभावों का परीक्षण करने देता है।

क्या यह अंतर अभी भी महत्वपूर्ण है?

उपमाओं और रूपकों के बीच अंतर की तरह, स्टब्स और मोक्स के बीच का अंतर सूक्ष्म और ऐतिहासिक है, और शायद किसी भी बड़े तकनीकी अंतर की तुलना में परीक्षण दुनिया में विभिन्न समुदायों और दर्शन के साथ अधिक करना है।

वे परीक्षण के लिए थोड़ा अलग दृष्टिकोण का प्रतिनिधित्व करते हैं। एक ठूंठ को ठूंठ की तरह लिखा जा सकता है। एक स्टब को आमतौर पर मॉक में विस्तारित किया जा सकता है।

जो आपको उपयोग करना चाहिए?

आप पा सकते हैं कि आप स्टब्स बनाना शुरू कर देते हैं, फिर बाद में आप पा सकते हैं कि आपको अपनी कुछ वस्तुओं के लिए मोक्स पर पूर्ण बनाने की आवश्यकता है। आप अपनी मर्जी से सबकुछ मॉक करना चाहते हैं, या जहां आवश्यक हो, वहां आप केवल मॉक करना चाहते हैं।


7

मॉक और स्टब के बीच अंतर: स्टब के साथ, आप अपनी यूनिट टेस्ट के इनपुट को ठीक करते हैं: इसलिए आपकी यूनिट टेस्ट स्टब और स्टब पर जोर नहीं देती है, किसी विधि के कार्यान्वयन को फिर से लिखकर नकली वस्तु के व्यवहार को ठीक करती है। मॉक के साथ, आप अपने यूनिट टेस्ट के ouput को ठीक करते हैं: इसलिए आपकी यूनिट टेस्ट आपके मॉक ऑब्जेक्ट में आंतरिक इंटरैक्शन की जांच करके आपके मॉकिंग ऑब्जेक्ट पर एक उम्मीद बनाती है।


आप कह रहे हैं कि आपके परीक्षण को नकली के आउटपुट की "जांच" करनी चाहिए। यदि आप ऐसा कह रहे हैं, तो आप गलत हैं। एक नकली का परीक्षण नहीं किया जाना चाहिए; यह वहाँ है तो आप अन्य कोड का परीक्षण कर सकते हैं । या आपके अंतिम वाक्य का अर्थ कुछ और है?
एंड्रयू बार्बर 20

1
हाय एंड्रयू, जैसा कि मैंने लिखा है मॉक के साथ आप अपने परीक्षण के उत्पादन को ठीक करते हैं, इसलिए आप इसका परीक्षण नहीं करेंगे। इसके अलावा, मैंने लिखा है कि मॉक आपको बातचीत की उम्मीद करने की अनुमति देता है (उम्मीद के व्यवहार ... ;-)
हसन बुथोघा

1
ठीक है, यह अधिक समझ में आता है। स्पष्टीकरण के लिए धन्यवाद!
एंड्रयू बार्बर

> स्टब पर जोर नहीं देता है क्यों कई जोर पुस्तकालयों में अभी भी मापदंडों should have been called withको मुखर करने के लिए उर्फ मौजूद है stub
नर्कबॉय

5

Moq फ्रेमवर्क के मामले में - सेटअप विधि STUB है जहां सत्यापन विधि मॉक है


0

एक बात जो मैंने देखी है, वह यह है कि जब मैं MockRepository.GenerateMock का उपयोग करता हूं, तो मुझे उस कॉल को इंटरसेप्ट करने के लिए एक विशिष्ट विधि कॉल पर अपेक्षाओं को स्पष्ट रूप से सेट करने की आवश्यकता होती है। जब तक यह आभासी है तब तक स्टब्स के साथ, यह किसी भी विधि को स्वचालित रूप से बाधित करने के लिए लगता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.