C# 使用MemoryStream的单元测试系统IO管道

C# 使用MemoryStream的单元测试系统IO管道,c#,xunit,C#,Xunit,我正在尝试测试我的基本System.IO.Pipelines设置,其中来自写入程序的内存将从与代码类似的TcpClient流(ReadAsync-method)中填充 问题是,使用的MemoryStream始终会立即继续读取0个字节,因为ReadAsync只是read的异步包装器。是否有可能在我的单元测试中获得类似的NetworkStream-行为?要模拟的行为是什么?如果要使MemoryStream在没有字节时等待(因此要等待,直到向它提供一些字节),一个可能的解决方案是在MemoryStre

我正在尝试测试我的基本System.IO.Pipelines设置,其中来自写入程序的内存将从与代码类似的TcpClient流(
ReadAsync
-method)中填充


问题是,使用的MemoryStream始终会立即继续读取0个字节,因为
ReadAsync
只是
read
的异步包装器。是否有可能在我的单元测试中获得类似的
NetworkStream
-行为?

要模拟的行为是什么?如果要使MemoryStream在没有字节时等待(因此要等待,直到向它提供一些字节),一个可能的解决方案是在MemoryStream周围使用包装器,覆盖Read或ReadAsync方法,并检查和睡眠,直到缓冲区有一些字节。不过,电话仍将被阻塞。或者,您可以在AsyncRead中等待一个异步方法,它将填充您的内存流,这正是我一直在/我一直在寻找的。“或者你可以在AsyncRead中等待一个异步方法来填充你的内存流”-我一开始没有想到ManualResetEvent,但这是我第一次想到阅读你的评论-它现在可以工作了。如果你提供一些解决方案,我可以检查它是否已解决(而不是注释),注释是可以的:)你正在解决的问题才是重要的。这没有内置的功能,不需要。您需要创建自己的
-派生类。如果有人对实现这样一个
-派生类有相同的要求:我强烈建议您看看@StephenCleary的AsyncEx库-它真的很有帮助
Memory<byte> memory = writer.GetMemory(minimumBufferSize);
int read = await stream.ReadAsync(memory);
streamMock
.Setup(m => m.ReadAsync(It.IsAny<Memory<byte>>(), It.IsAny<CancellationToken>()))
.Returns((Memory<byte> memory, CancellationToken token) =>
{
     return memStream.ReadAsync(memory, cancelToken);
}