模拟Networkstream.Read

oba*_*lis 6 .net c# tdd stream

我一直试图模拟网络流进行一些单元测试.

到目前为止,使用Moq我得到的最好的是使用流的包装器然后模拟我的界面.

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

    void Flush();

    bool DataAvailable { get; }

    bool CanRead { get; }

    void close();
}
Run Code Online (Sandbox Code Playgroud)

问题是,虽然这给了我一个开始,但实际上我想测试一些字节数组值作为读入我的读缓冲区.在模拟对象上调用Read()时,如何将一些测试数据返回到缓冲区?

foo*_*ode 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]);
}
Run Code Online (Sandbox Code Playgroud)

但我建议您重新考虑这种嘲笑的策略,请参阅: http ://davesquared.net/2011/04/dont-mock-types-you-dont-own.html

也许您可以编写一个集成测试,或者使您的代码依赖于抽象 Stream 类。

在您的测试中,您可以使用 MemoryStream 来检查您的类在从流中获取数据时的正确行为。