C# 模拟流以读取字节[]
我的SUT需要一个C# 模拟流以读取字节[],c#,.net,mocking,nunit,moq,C#,.net,Mocking,Nunit,Moq,我的SUT需要一个流作为参数,执行一些操作,然后返回一个字节[]: public byte[] ProcessRequest(INetworkStream networkStream) INetworkStream包装Stream 我想模拟流参数来控制它读取的字节,这样我就可以用这些字节测试该方法 stream.Read(buffer, offset, size); Stream.Read(…)返回一个int并填充buffer参数 使用Moq如何伪造调用INetworkStream.Read
流
作为参数,执行一些操作,然后返回一个字节[]
:
public byte[] ProcessRequest(INetworkStream networkStream)
INetworkStream
包装Stream
我想模拟流
参数来控制它读取的字节,这样我就可以用这些字节测试该方法
stream.Read(buffer, offset, size);
Stream.Read(…)
返回一个int
并填充buffer
参数
使用Moq
如何伪造调用INetworkStream.Read(…)
的结果(因此我控制字节[]
的长度作为返回值,还控制缓冲区
参数)
委员会:
看起来你对链接到的答案有点困惑。现在您有了一个界面
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);
var stream=new Mock();
stream.Setup(x=>x.Read(It.IsAny(),It.IsAny(),It.IsAny())
.Callback((字节[]缓冲区,整数偏移量,整数大小)=>
{
数组.Copy(临时缓冲区、偏移量、缓冲区、0、大小)
}
)
.返回((字节[]缓冲区,整数偏移量,整数大小)=>size);
请注意,我不是Moq用户,因此我这里的语法可能有点错误,但它应该传达如何正确实现它的想法。我需要更改数组复制方法
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);
stream.Setup(x=>x.Read(It.IsAny(),It.IsAny(),It.IsAny())
.Callback((字节[]缓冲区,整数偏移量,整数大小)=>
{
复制(tempBuffer,offset,buffer,0,tempBuffer.Length);
})
.返回((字节[]缓冲区,整数偏移量,整数大小)=>size);
INetworkStream
包装了Stream
-->这似乎很奇怪,因为INetworkStream
似乎是一个接口,而Stream
是一个类。接口不能从类派生。这到底是怎么回事?我说的是包裹,不是衍生。是的,但那是不可能的。接口只是一个契约定义。它无法包装任何内容,因为没有实现。接口在实现实现合同时定义合同,并包装流
。由于SUT需要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, tempBuffer.Length);
})
.Returns((byte[] buffer, int offset, int size) => size);