2009-03-10 16 views
18

क्या मैं रनटाइम के दौरान स्टब के व्यवहार को बदल सकता हूं? की तरह कुछ:स्टब्स के व्यवहार को कैसे बदला जाए?

public interface IFoo { string GetBar(); } 
    [TestMethod] 
    public void TestRhino() 
    { 
     var fi = MockRepository.GenerateStub<IFoo>(); 
     fi.Stub(x => x.GetBar()).Return("A"); 
     Assert.AreEqual("A", fi.GetBar()); 
     fi.Stub(x => x.GetBar()).Return("B"); 
     Assert.AreEqual("B", fi.GetBar()); // Currently fails here 
    } 

मेरे कोड उदाहरण अभी भी दिया लाइन में विफल रहता है, fi.GetBar() अभी भी "A" देता है।

या ऐसे स्टब्स मॉडल के लिए एक और चाल है जिसका व्यवहार समय के साथ बदलता है? मैं fi.Stub(...).Do(...) का उपयोग करने का सहारा लेना चाहता हूं।

आह, शायद मुझे किसी के लिए सिर पर मारने के लिए ठीक मैनुअल की हार्डकॉपी की आवश्यकता है। ऐसा लगता है कि यह वास्तव में स्पष्ट होना चाहिए, लेकिन मुझे यह नहीं मिल रहा है।

+0

'fi.Stub (x => x.GetBar()) आज़माएं। वापसी (" ए ")। दोहराना। एक बार(); 'और' fi.Stub (x => x.GetBar())। वापसी ("बी") दोहराना। एक बार(); ' –

उत्तर

26

चेतावनी

स्टब्स के व्यवहार को बदलने से एक कोड गंध है!

यह आमतौर पर इंगित करता है कि आपके यूनिट परीक्षण बहुत जटिल हैं, समझने में कठोर हैं और भंगुर हैं, परीक्षण के तहत कक्षा के सही परिवर्तनों पर आसानी से तोड़ रहे हैं।

चेक आउट:

  • [XUnit टेस्ट पैटर्न] [1]
  • [इकाई परीक्षण का कला] [2]

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


आह, मैंने इसे स्वयं समझ लिया। राइनो रिकॉर्ड/रीप्ले मोड का समर्थन करता है। जबकि एएए सिंटैक्स हमेशा वस्तुओं को रीप्ले मोड में रखता है, हम स्टब के व्यवहार को साफ़ करने के लिए रिकॉर्ड करने के लिए रिकॉर्ड कर सकते हैं और फिर से चलाने के लिए वापस जा सकते हैं।

यह थोड़ा hackish लग रहा है हालांकि, ...

public interface IFoo { string GetBar(); } 
    [TestMethod] 
    public void TestRhino() 
    { 
     var fi = MockRepository.GenerateStub<IFoo>(); 
     fi.Stub(x => x.GetBar()).Return("A"); 
     Assert.AreEqual("A", fi.GetBar()); 

     // Switch to record to clear behaviour and then back to replay 
     fi.BackToRecord(BackToRecordOptions.All); 
     fi.Replay(); 

     fi.Stub(x => x.GetBar()).Return("B"); 
     Assert.AreEqual("B", fi.GetBar()); 
    } 

अद्यतन:

मैं भविष्य में इस का उपयोग किया जाएगा, इसलिए चीजों को एक छोटे से अच्छे लग रहे:

internal static class MockExtension { 
    public static void ClearBehavior<T>(this T fi) 
    { 
     // Switch back to record and then to replay - that 
     // clears all behaviour and we can program new behavior. 
     // Record/Replay do not occur otherwise in our tests, that another method of 
     // using Rhino Mocks. 

     fi.BackToRecord(BackToRecordOptions.All); 
     fi.Replay(); 
    } 
} 
+0

यदि आप शब्दावली का उपयोग करना चाहते हैं जो एन है राइनो मोक्स के लिए एटीव, इसे साफ़ करें एक्सप्लोरेशंस –

+1

@ रिचर्ड: 'एसट्यूब' के साथ जोड़ा गया व्यवहार अपेक्षाओं को सेट नहीं करता है। आप 'एक्सप्पेक्ट' के साथ व्यवहार के बारे में सोच रहे हैं। –

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