2010-02-19 22 views
10

मुझे यह समस्या है, जो राइनो मोक्स 3.5 में एक बग हो सकती है:राइनो मोक्स ओवरराइटिंग स्टब्स संभव है?

stubObj = MockRepository.GenerateStub(IObject); 

stubObj.Stub(a=>a.Get()).Return (Guid.Empty); //1.stub 
stubObj.Stub(a=>a.Get()).Return (Guid.NewGuid()); //2.stub, should overwrite the first one? 

यह:

var value = stubObj.Get(); 

Guid.Empty देता है, क्या यह सही व्यवहार है?

+0

मैं काफी समझ में नहीं आता क्यों तुम 'के ऊपर लिख' के लिए एक उम्मीद हैं:

यहां ऐसे कुछ तरीके "के ऊपर लिख" के बाद दूसरे स्थान के साथ पहली बार उम्मीद कर रहे हैं। व्यवहार मेरे लिए ठीक लगता है। सिर्फ मुझसे एक अटकलें: यदि आप किसी अन्य दावे के लिए एक स्टब का पुनः उपयोग या रीसायकल करने का प्रयास कर रहे हैं, तो आपको ऐसा नहीं करना चाहिए। परीक्षण लिखने के लिए यह एक अच्छा अभ्यास नहीं होगा। –

उत्तर

0

निम्नलिखित परीक्षण पास करना चाहिए:

// arrange 
var stubObj = MockRepository.GenerateStub<IObject>(); 
stubObj.Stub(a => a.Get()) 
     .Return(Guid.Empty); 
// act 
var value = stubObj.Get(); 
// assert 
Assert.AreEqual(Guid.Empty, value); 

और अगर आप एक नया GUID लौटना चाहते:

// arrange 
var stubObj = MockRepository.GenerateStub<IObject>(); 
stubObj.Stub(a => a.Get()) 
     .Return(Guid.NewGuid()); 
// act 
var value = stubObj.Get(); 
// assert 
Assert.AreNotEqual(Guid.Empty, value); 
+0

धन्यवाद, लेकिन मैं इसे एक बार फिर से व्यवस्थित वापसी मूल्य बदलने के लिए व्यवस्थित नहीं करना चाहता हूं। क्या कोई प्रकार की रीप्ले() विधि है जो केवल निर्दिष्ट स्टब ऑब्जेक्ट को दोहराती है? – David

1

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

अपने परीक्षण कोड में, जो छोटा और साफ होना चाहिए, वहां ऐसा कोई मामला नहीं होना चाहिए जहां आपको ऐसा करने के लिए नकली के ऐसे प्रोग्रामिंग को 'पूर्ववत' करने की आवश्यकता हो।

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

और तब, जब आप यह स्पष्ट है, यह refactor बाहर के रूप में आप टेस्ट में सशर्त तर्क नहीं करना चाहिए था बनाया है (XUnit टेस्ट पैटर्न देखें)

+0

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

+0

@wcoenen: मैं RhinoMocks का उपयोग नहीं करता, और कई मॉडलों और अन्य विरासत क्रॉफ्ट के कारण क्रूर और भ्रम प्राथमिक कारण है (मैं मोक चुनता हूं क्योंकि यह एक राय है)। मुख्य प्रतिक्रिया जो मैं अपनी प्रतिक्रिया में प्राप्त करना चाहता था वह यह था कि आम तौर पर आप कई कॉल की तैयारी कर रहे हैं और इसलिए ज्यादातर मामलों में ढांचे के बारे में आश्चर्य की बात होगी कि वे सभी उन सभी को ध्वस्त कर सकते हैं जिस तरह से प्रश्नकर्ता लगता है सुझाव देने के लिए समझ में आता है)। मैं किसी के लिए आरएम उपयोगकर्ताओं के लिए कम भ्रमित करने के लिए अपनी शब्दावली में प्रवेश करने और संपादित करने के लिए खुश हूं। –

+0

@wcoenen: मैंने सामान्य शब्दावली के साथ इसे बदलकर आरएम शब्दावली के दुरुपयोग को हटाने की कोशिश की है और चीजों को कम भ्रमित करने के लिए किसी भी अतिरिक्त संपादन की सराहना करता हूं। (हाल के दिनों में अध्याय 6 या प्रगप्रोग की यूनिट टेस्टिंग बुक [प्रकाशित 2007] पढ़ रहा था जो राइनोमोक्स को एक साइडबार में रेखांकित करता है [और मोक का उल्लेख नहीं करता] जो शब्दावली के साथ मदद नहीं करेगा। (मैं अभी भी अपने मुख्य बिंदु पर खड़ा हूं परीक्षण के हिस्से के रूप में एक स्टब/नकली सेटअप को संशोधित नहीं करना चाहिए या अन्यथा इस तरह के किसी भी सशर्त तर्क में परीक्षण एंटीपेटर्न में शामिल होना चाहिए।) –

8

आप समय की खाली guid एक ज्ञात संख्या वापस जाने के लिए चाहते हैं , केवल एक चीज जो आपको करना है वह है RhinoMocks को दोहराने के लिए कितनी बार, उदाहरण के लिए निम्न परीक्षण गुजरता है:

[Test] 
    public void MultipleStubsTest() 
    { 
     var testMock = MockRepository.GenerateMock<ITest>(); 
     testMock.Stub(x => x.Get()).Return(Guid.Empty).Repeat.Once(); 
     testMock.Stub(x => x.Get()).Return(Guid.NewGuid()); 

     Assert.AreEqual(Guid.Empty, testMock.Get()); 
     Assert.AreNotEqual(Guid.Empty, testMock.Get()); 
    } 

अगर आप (कितनी बार जाओ() से पहले GUID बदलना चाहिए बुलाया जाएगा, की तुलना में आप हमेशा .Do() और वहाँ कोड का उपयोग कर सकते पता नहीं है मुझे तो कृपया पता है कि आपको अधिक जानकारी चाहिए या नहीं)।

+0

मैं ** ** ** ** और अधिक जानकारी दूंगा कि मैं 'Do()' का उपयोग कैसे कर सकता हूं मुझे नहीं पता कि 'गेट()' कहलाए जाने की संख्या कितनी होगी। मैं 'नए मॉक' के साथ 'टेस्टमॉक' को प्रतिस्थापित नहीं कर सकता, इसलिए इसके बजाय मुझे 'get() 'रिटर्न' मान को बदलने की जरूरत है। – smoksnes

+0

कभी नहीं मिला। यहां जवाब। http://stackoverflow.com/questions/13918281/why-cant-i-change-the-return-value-in-a-rhino-mocks-stub-object – smoksnes

1

इस तरह आप इसे कैसे करेंगे। यह मेरी मशीन पर गुजरता है।

[TestMethod] 
    public void Test() 
    { 
     stubObj = MockRepository.GenerateMock<IGuidTest>(); 

     stubObj.Stub(a => a.Get()).Repeat.Times(1).Return(Guid.Empty); 
     stubObj.Stub(a => a.Get()).Repeat.Times(1).Return(Guid.NewGuid()); 

     Assert.AreEqual(Guid.Empty, stubObj.Get()); 
     Assert.AreNotEqual(Guid.Empty, stubObj.Get()); 

    } 
    public IGuidTest stubObj; 
    public interface IGuidTest 
    { 
     Guid Get(); 
    } 
-1

हां, यह अपेक्षित व्यवहार है। उम्मीदों/स्टब्स को उस तरीके से लिखना, ग्रिड को वापस करने के लिए मॉकिंग फ्रेमवर्क को बताता है। पहली बार गेट() विधि को बुलाया जाता है और दूसरी बार Guid.NewGuid() को वापस कॉल किया जाता है। How to change behaviour of stubs?

+0

नहीं, बिना .epeat.Once विकल्प , स्टब केवल पहला स्टब (खाली) लौटाएं और कभी दूसरा (नया) न करें। –

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