C# 模拟流以读取字节[]

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

我的SUT需要一个
作为参数,执行一些操作,然后返回一个
字节[]

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