gpt4 book ai didi

c# - 使用 MemoryStream 模拟 NetworkStream 以进行单元测试

转载 作者:行者123 更新时间:2023-11-30 16:27:46 26 4
gpt4 key购买 nike

我有一个包装流的类,目的是该流可能是 NetworkStream。但是在单元测试中,使用 MemoryStream 来验证功能要容易得多。但是我注意到 MemoryStream 和 NetworkStream 在写入时实际上并不相同。

当我写入 MemoryStream 时,流的查找指针被设置为我所写内容的末尾。为了读出我写的内容,我必须将 Seek 指针调整回我写的内容的开头。

当我写入 NetworkStream 时,流的另一端无需调整查找指针即可读取该数据。

我假设 NetworkStream 正在内部处理搜索指针的概念,并确保即使它正在将数据填充到另一端的流中,它也不会调整指针。

那么我的问题是,在 MemoryStream 中模拟相同行为的最佳方法是什么?我想我可能只是将指针找回我写的相同字节数,但这看起来很笨拙。此外,如果我将这些流中的几个堆叠在一起或其他包装流,它们将如何知道指针是否需要重置?

最佳答案

MemoryStream 不是为您的使用方式而设计的。 NetworkStream 旨在让您用输出填充一 block 内存。它的设计目的不是让第二个对象读取原始对象所写的内容。

我建议您创建一个 FakeNetworkStream 类。您将有两个对象,写入一个对象会将数据添加到另一个对象。但是 FakeNetworkStream 的优点是您可以实现病态套接字行为以检测尽可能多的错误。

  1. 在用户刷新流之前不要发送任何数据。当套接字未刷新时可能会出现细微错误,因为实际发送数据的位置可能会有所不同。通过始终等待刷新,您可以在实际需要刷新时让测试失败。
  2. 不保证读取会生成您请求的所有数据。通过一次只生成一个字节来模拟这一点。

关于c# - 使用 MemoryStream 模拟 NetworkStream 以进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7571504/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com