我的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
参数)?
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);
}
}
答案 0 :(得分:6)
看起来你对你所链接的答案感到有些困惑。您现在有一个界面INetworkStream
。简单地嘲笑它。
您无需在测试中使用NetworkStream
或Stream
(请参阅原始问题中的最后一位代码,它包含您要使用的代码。忽略答案已发布在问题上。)
你可以设置你的模拟:
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);