模拟流以读取byte []

时间:2013-09-17 09:30:15

标签: c# .net mocking nunit moq

我的SUT需要Stream作为参数,有些工作,然后返回byte[]

public byte[] ProcessRequest(INetworkStream networkStream)

INetworkStream包裹Stream

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

stream.Read(buffer, offset, size);

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

使用Moq如何伪造对INetworkStream.Read(...)的调用结果(因此我将byte[]的长度控制为返回值,同时也控制buffer参数)?

Stream wrapper

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

2 个答案:

答案 0 :(得分: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);

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

答案 1 :(得分:0)

我需要更改Array Copy方法

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, tempBuffer.Length);
              })
              .Returns((byte[] buffer, int offset, int size) => size);