簡體   English   中英

模擬Networkstream.Read

[英]Mock Networkstream.Read

我一直試圖模擬網絡流進行一些單元測試。

到目前為止,使用Moq我得到的最好的是使用流的包裝器然后模擬我的界面。

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

    void Flush();

    bool DataAvailable { get; }

    bool CanRead { get; }

    void close();
}

問題是,雖然這給了我一個開始,但實際上我想測試一些字節數組值作為讀入我的讀緩沖區。 在模擬對象上調用Read()時,如何將一些測試數據返回到緩沖區?

您可以使用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]);
}

您可以使用回調來訪問傳遞的參數並更改它們:

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

也許您可以編寫集成測試,或者讓您的代碼依賴於抽象Stream類。

在測試中,您可以使用MemoryStream在從Stream中獲取數據時檢查類的正確行為。

在Rhinomocks中,這非常簡單,因為NetworkStream上的重要方法是虛擬的,因此您可以使用MockRepository簡單地創建存根。 更好的是,它理解傳遞給Read方法的字節數組是一個輸出數組,因此您可以使用以下代碼完全刪除對Read()的調用:

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);

不需要包裝。

我對Moq的經驗很少,但如果它不支持類似的東西,我會感到驚訝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM