2012-09-10 22 views
5

यदि mock.Stub()। रिटर्न() का उपयोग कर राइनो मोक्स में नकली व्यवहार को बदलना संभव है, तो हमें वैसे भी स्टब्स की आवश्यकता क्यों है?राइनो मोक्स - क्या हमें वास्तव में स्टब्स की आवश्यकता है?

हम हमेशा MockRepository.GenerateMock() का उपयोग करके क्या खो देते हैं?

स्टब्स के बजाय मोक्स का उपयोग करने का एक बड़ा लाभ यह है कि हम उन्हें साफ और सीधा रखने के सभी परीक्षणों के बीच एक ही उदाहरण का पुन: उपयोग करने में सक्षम होंगे।

moq ढांचे एक ही तरीके से काम करता है ... हमारे पास मोजे और स्टब्स के लिए अलग-अलग वस्तुएं नहीं हैं।

(कृपया, फाउलर की के लिंक के साथ उत्तर नहीं देते लेख "Mocks नहीं स्टब्स हैं")

उत्तर

3

एक बहुत स्पष्ट उत्तर in the documentation है:

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

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

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

+0

इस ठूंठ बनाम नकली की अवधारणा है, लेकिन जैसा कि मैंने सवाल में कहा, आप एक का उपयोग कर सकते हैं राइनो के साथ एक स्टब के रूप में नकली। तो, मेरे प्रश्न पर वापस, दो अलग-अलग वस्तुओं के होने का क्या फायदा है? MockRepository.GenerateMock() का उपयोग करके हम हमेशा क्या खो देते हैं? –

+0

हां, आप * एक मॉक का उपयोग स्टब के रूप में कर सकते हैं। हालांकि, जैसा कि ऊपर बताया गया है, यदि आप कभी भी अपने नकली परीक्षण परिणाम को प्रभावित नहीं करना चाहते हैं, तो एक स्टब का उपयोग करें। –

+0

क्या आप समझा सकते हैं क्यों? अपना तर्क साबित करने के लिए कुछ कोड दिखाने के बारे में क्या? –

6

ध्यान रखें कि राइनो अब विकसित नहीं हुआ है । नई व्यवस्थाएं इस नकली ठूंठ अंतर को पूरी तरह छोड़ और उनके परीक्षण के लिए एकल पद परिचय डबल्स:

मोक का विकास किंग फ्रेमवर्क "एक सामान्य उद्देश्य इकाई" की ओर धक्का लग रहा है, परीक्षण केस संदर्भ के आधार पर अलग-अलग अलग-अलग होने के बजाय।

कैसे कि जुदाई (नकली, ठूंठ, नकली) जन्म लिया है और के बारे में अधिक जानने के लिए क्या उद्देश्यों यह कार्य किया है, मैं पढ़ने का सुझाव Mark Seemann's लेख continuum of test doubles के बारे में:

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


यह लग सकता है कि राइनो नकली और ठूंठ बीच भेद नहीं करता है, लेकिन वहाँ सूक्ष्म अंतर है। उदाहरण के लिए, संपत्ति गेटर छोटा करते पर विचार करें:

var mock = MockRepository.GenerateMock<IService>(); 
mock.Stub(m => m.Property).Return(42); 

इस तरह आप जब वस्तु नकली है यह करने के लिए है।

var stub = MockRepository.GenerateStub<IService>(); 
stub.Property = 42; 

हालांकि कि केवल एक ही है कि इस समय मेरे मन में आ रहा है है, वहाँ कुछ और हो सकता है: दूसरी ओर स्टब, संपत्ति अर्थ विज्ञान है, जो पूरे बात महत्वहीन परिचय देता है। लेकिन फिर भी, वे सिर्फ मामूली बारीकियों हैं।

1: 2013/05/19 के रूप में, यह अब सच हो सकता है: Rhino Mocks new home

+0

मैंने कुछ परियोजनाओं में moq का इस्तेमाल किया और मुझे प्यार था! लेकिन अभी मैं एक परियोजना पर काम कर रहा हूं जो राइनो का उपयोग करता है ... इसलिए, मैं समझने की कोशिश कर रहा हूं कि हम स्टब्स को क्यों भूल नहीं सकते हैं और इस ढांचे के साथ मॉक का उपयोग दोनों उद्देश्यों के साथ करते हैं जैसे हम moq के साथ करते हैं। –

+0

बीटीडब्ल्यू, लेख साझा करने के लिए tks ... मैं एक नज़र रखना होगा! –

+1

@ मार्सेलो ओलिविरा: मुझे पूरा यकीन है कि राइनो विकसित हुआ था, तो हमारे पास दो अलग-अलग प्रकार नहीं होंगे। कुल मिलाकर आप सही हैं, स्टब और नकली के बीच बहुत अंतर नहीं है। हालांकि, ** ** कुछ हैं (मामूली हालांकि)। उदाहरण के लिए मेरा अद्यतन उत्तर देखें। –