3

我的 SUT 需要 aStream作为参数,做一些工作然后返回 a byte[]

public byte[] ProcessRequest(INetworkStream networkStream)

INetworkStream包裹Stream

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

stream.Read(buffer, offset, size);

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

2 回答 2

8

看起来您对链接到的答案有些困惑。你现在有了一个界面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 用户,所以我的语法可能有点偏离,但它应该传达有关如何正确实现它的想法。

于 2013-09-17T09:35:18.273 回答
0

我需要更改数组复制方法

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);
于 2019-07-02T18:09:38.173 回答