模拟流以读取byte []

Sam*_*ach 3 .net c# nunit moq mocking

我的SUT需要一个Stream参数,做一些工作,然后返回一个byte[]:

public byte[] ProcessRequest(INetworkStream networkStream)
Run Code Online (Sandbox Code Playgroud)

INetworkStream包裹Stream.

我想模拟Stream参数来控制它读取的字节,所以我可以用这些字节测试方法.

stream.Read(buffer, offset, size);
Run Code Online (Sandbox Code Playgroud)

Stream.Read(...)返回int并填充buffer参数.

使用Moq如何伪造调用的结果INetworkStream.Read(...)(所以我控制byte[]返回值的长度和buffer参数)?

流包装:

public class FakeNetworkStream : INetworkStream
{
    private NetworkStream stream;

    public FakeNetworkStream(NetworkStream ns)
    {
        if (ns == null) throw new ArgumentNullException("ns");
        this.stream = ns;
    }

    public bool DataAvailable
    {
        get
        {
            return this.stream.DataAvailable;
        }
    }

    public int Read(byte[] buffer, int offset, int size)
    {
        return this.stream.Read(buffer, offset, size);
    }

    public void Write(byte[] buffer, int offset, int size)
    {
        this.stream.Write(buffer, offset, size);
    }
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*rth 6

看起来你对你所链接的答案感到有些困惑.你现在有了一个界面INetworkStream.简单地嘲笑它.
无需使用NetworkStreamStream在您的测试中(参考原始问题中的最后一位代码,它包含您要使用的代码.忽略已在问题上发布的答案.)

你会设置你的模拟类似的东西:

var stream = new Mock<INetworkStream>();
stream.Setup(x => x.Read(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>()))
      .Callback((byte[] buffer, int offset, int size) =>
                {
                    Array.Copy(tempBuffer, offset, buffer, 0, size) 
                }
               )
      .Returns((byte[] buffer, int offset, int size) => size);
Run Code Online (Sandbox Code Playgroud)

请注意,我不是Moq用户,所以我的语法可能有点偏,但它应该传达如何正确实现它的想法.