使用MemoryStream模拟NetworkStream进行单元测试

时间:2011-09-27 15:14:11

标签: c# unit-testing stream

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

当我写入MemoryStream时,流的搜索指针设置为我写的结尾。为了读出我写的内容,我必须将Seek指针调整回我写的开头。

当我写入NetworkStream时,流的另一端可以读取该数据而无需调整搜索指针。

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

我的问题是,在MemoryStream中模拟相同行为的最佳方法是什么?我以为我可能只是寻找指针返回我写的相同数量的字节,但这似乎很狡猾。此外,如果我将这些流中的几个堆叠在一起或其他包裹的流,他们将如何知道指针是否需要重置?

1 个答案:

答案 0 :(得分:2)

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

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

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