2012-11-10 16 views
6

पढ़ें मैं कुछ यूनिट परीक्षणों के लिए नेटवर्क स्ट्रीम का नकल करने की कोशिश कर रहा हूं।नकली नेटवर्कस्ट्रीम।

अब तक, मोक का उपयोग करके मैं सबसे अच्छा आया हूं, स्ट्रीम के लिए एक रैपर का उपयोग करना और फिर मेरा इंटरफ़ेस नकल करना है।

public interface INetworkstreamWrapper 
{ 
    int Read(byte[] buffer, int offset,int size); 

    void Flush(); 

    bool DataAvailable { get; } 

    bool CanRead { get; } 

    void close(); 
} 

प्रश्न है, जबकि कि मुझे एक प्रारंभ हो जाता है, मैं वास्तव में कुछ बाइट सरणी मूल्यों का परीक्षण करना चाहते के रूप में मेरे पढ़ने बफर में पढ़ें। नकली ऑब्जेक्ट पर Read() को कॉल करते समय मैं कुछ परीक्षण डेटा को बफर में कैसे वापस कर सकता हूं?

उत्तर

4

आप एक कॉलबैक का उपयोग कर सकते पारित कर दिया पैरामीटर में पहुँच प्राप्त है और उन्हें बदलने के लिए:

public void TestRead() 
{ 
    var streamMock = new Mock<INetworkstreamWrapper>(); 

    streamMock 
      .Setup(m => m.Read(It.IsAny<byte[]>(), 
           It.IsAny<int>(), 
           It.IsAny<int>())) 
      .Callback((byte[] buffer, int offset, int size) => buffer[0] = 128); 

    var myBuffer = new byte[10]; 
    streamMock.Object.Read(myBuffer,0,10); 

    Assert.AreEqual(128, myBuffer[0]); 
} 

लेकिन मैं तुम्हें अपनी रणनीति पर पुनर्विचार का सुझाव उस तरह के मॉकिंग के बारे में, देखें: http://davesquared.net/2011/04/dont-mock-types-you-dont-own.html

शायद आप इसके बजाय एकीकरण परीक्षण लिख सकते हैं, या बनाना ई आपका कोड सार स्ट्रीम कक्षा पर निर्भर करता है।

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

+0

आपके उत्तर के लिए धन्यवाद। दिलचस्प आलेख। – obaylis

4

आप Setup उपयोग कर सकते हैं यह करने के लिए:

[Test] 
public void MockStreamTest() 
{ 
    var mock = new Mock<INetworkstreamWrapper>(); 
    int returnValue = 1; 
    mock.Setup(x => x.Read(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>())) 
        .Returns((byte[] r,int o, int s) => 
            { 
             r[0] = 1; 
             return returnValue; 
            }); 
    var bytes = new byte[1024]; 
    var read = mock.Object.Read(bytes , 1, 1); 
    //Verify the the method was called with expected arguments like this: 
    mock.Verify(x => x.Read(bytes, 1, 1), Times.Once()); 
    Assert.AreEqual(returnValue, read); 
    Assert.AreEqual(1,bytes[0]); 
} 
+0

मैं जो करना चाहता था वह नकली नेटवर्कस्ट्रीम स्थापित किया गया था ताकि जब मैं रीड() को कॉल करता हूं तो यह बफर में बाइट सरणी वापस कर देगा। इस तरह से मैं एक ज्ञात बाइट सरणी परिणाम के खिलाफ अपने कोड का परीक्षण कर सकते हैं। आपकी प्रतिक्रिया से मैं सिर्फ वापसी मूल्य निर्धारित कर रहा हूं? – obaylis

+0

मेरा उत्तर अपडेट किया गया –

0

Rhinomocks में, यह बहुत आसान है, क्योंकि नेटवर्कस्ट्रीम पर महत्वपूर्ण विधियां आभासी हैं, और इसलिए आप बस मॉक रिपोजिटरी का उपयोग करके एक स्टब बना सकते हैं। और भी बेहतर, यह समझता है कि बाइट सरणी पढ़ें विधि के लिए पारित एक आउटपुट सरणी है, तो आप पूरी तरह से एक कॉल टू रीड) बाहर ठूंठ कर सकते हैं (इस कोड का उपयोग:

NetworkStream stream = MockRepository.GenerateStub<NetworkStream>(); 
stream.Stub(x => x.Read(Arg<byte[]>.Out(bytes).Dummy, Arg<int>.Is.Anything, Arg<int>.Is.Anything)) 
     .Return(bytes.Length); 

कोई आवरण की आवश्यकता है।

मुझे मोक के साथ बहुत कम अनुभव हुआ है लेकिन मुझे आश्चर्य होगा अगर यह कुछ समान समर्थन नहीं करता है।

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