2011-04-10 18 views
9

के साथ ऑर्डरिंग विधि रिटर्न वैल्यू मैंने रॉय ओशरोव के द आर्ट ऑफ यूनिट टेस्टिंग पढ़ने के दौरान राइनो-मोक्स (3.6) के साथ प्रयोग करना शुरू कर दिया है।राइनो-मॉक स्टब्स

[Test] 
    public void ReturnResultsFromMock() 
    { 
     MockRepository repository = new MockRepository(); 
     IGetRestuls resultGetter = repository.DynamicMock<IGetRestuls>(); 
     using(repository.Record()) 
     { 
      resultGetter.GetSomeNumber("a"); 
      LastCall.Return(1); 

      resultGetter.GetSomeNumber("a"); 
      LastCall.Return(2); 

      resultGetter.GetSomeNumber("b"); 
      LastCall.Return(3); 

     } 

     int result = resultGetter.GetSomeNumber("b"); 
     Assert.AreEqual(3, result); 

     int result2 = resultGetter.GetSomeNumber("a"); 
     Assert.AreEqual(1, result2); 

     int result3 = resultGetter.GetSomeNumber("a"); 
     Assert.AreEqual(2, result3); 
    } 

यह ठीक काम करता है: वह एक उदाहरण यह दर्शाता है कि है कि एक मज़ाक उड़ाया विधि है जब एक ही पैरामीटर के साथ दो बार बुलाया अलग परिणाम वापस जाने के लिए पटकथा लिखी जा सकती है।

[Test] 
    public void StubMethodWithStringParameter_ScriptTwoResponses_SameResponseReceived() 
    { 
     MockRepository mocks = new MockRepository(); 
     IMessageProvider stub = mocks.Stub<IMessageProvider>(); 

     using (mocks.Record()) 
     { 
      stub.GetMessageForValue("a"); 
      LastCall.Return("First call"); 
      stub.GetMessageForValue("a"); 
      LastCall.Return("Second call"); 
     } 

     Assert.AreEqual("First call", stub.GetMessageForValue("a")); 
     Assert.AreEqual("Second call", stub.GetMessageForValue("a")); 
    } 
} 

public interface IMessageProvider 
{ 
    string GetMessage(); 
    string GetMessageForValue(string value); 
} 

इस परीक्षण में विफल रहा है, क्योंकि "सबसे पहले कॉल" है: लेकिन जब मैं एक स्टब है, और एक विधि है कि स्वीकार करता है और एक स्ट्रिंग रिटर्न के साथ एक ही बात की कोशिश, मैं नहीं दूसरे वापसी मान उत्पन्न करने में सक्षम हूँ दोनों कॉल के लिए प्राप्त किया। मैंने वाक्यविन्यास के कई झुर्रियों की कोशिश की है (mocks.Ordered(), SetResult, Expect आदि का उपयोग करना), लेकिन फिर भी दिखाई देने वाला दूसरा परिणाम प्राप्त करने में असमर्थ हूं।

क्या मैं कुछ गलत कर रहा हूं, या क्या यह राइनो-मोक्स के साथ एक सीमा है? मैंने यह blog post चेक किया है, लेकिन सुझाए गए वाक्यविन्यास ने मेरी समस्या का समाधान नहीं किया है।

उत्तर

10

बिट से वंचित हो रहे ठूंठ कि पहले मूल्य केवल एक बार वापस आ जाना चाहिए बताने के लिए है:

... 
using (mocks.Record()) 
{ 
    stub.GetMessageForValue("a"); 
    LastCall.Return("First call").Repeat.Once(); 
    stub.GetMessageForValue("a"); 
    LastCall.Return("Second call"); 
} 
बेशक

अपने "दूसरा कॉल" वास्तव में "दूसरा या बाद में कॉल" जब तक इसका मतलब है आप दोहराने के साथ अन्य प्रतिबंध लगाते हैं।

तुम भी विचार कर सकते हैं नए व्यवस्था, अधिनियम, जोर (AAA) वाक्य रचना RhinoMocks अब प्रदान करता है:

[Test] 
public void StubMethodWithStringParameter_ScriptTwoResponses_SameResponseReceived() 
{ 
    IMessageProvider stub = MockRepository.GenerateStub<IMessageProvider>(); 

    stub.Expect(mp => mp.GetMessageForValue("a")) 
     .Return("First call") 
     .Repeat.Once(); 
    stub.Expect(mp => mp.GetMessageForValue("a")) 
     .Return("Second call"); 

    Assert.AreEqual("First call", stub.GetMessageForValue("a")); 
    Assert.AreEqual("Second call", stub.GetMessageForValue("a")); 
} 

यह रिकार्ड प्लेबैक- बारे में चिंता करने से बचाता है एक छोटे से अधिक संक्षिप्त है और आम तौर पर स्टब की स्थिति जोर दें। डेरिक बेली ने लॉस टेकियों पर article about using Repeat लिखा था। यह एएए वाक्यविन्यास का उपयोग भी होता है)।

+1

@ श्री-पोटीन, धन्यवाद! दोहराना। एक बार() अच्छी तरह से काम करता है। लेख पर –

+0

+1 ... मैं थोड़ी देर के लिए उस के बारे में एक अच्छी व्यापक व्याख्या की तलाश कर रहा हूं :) –

1

मुझे लगता है कि अगर आप, स्टब्स के साथ काम कर रहे हैं की अपेक्षा फिट नहीं करता है के रूप में आप एक उम्मीद है, लेकिन अपनी निर्भरता के लिए एक स्थानापन्न नहीं करना चाहते का उपयोग कर।

तो मेरा मानना ​​है कि अगर आप ठूंठ सिंटैक्स का उपयोग करें इसे और अधिक समझ में आता है:

stub.Stub.(s=>s.GetMessageForValue("a")) 
          .Return("First call").Repeat.Once(); 

stub.Stub.(s=>s.GetMessageForValue("a")) 
          .Return("Second call").Repeat.Any; 
संबंधित मुद्दे