2011-09-27 46 views
3

我有一个包装流的类,目的是将该流视为NetworkStream。但是在单元测试中,使用MemoryStream来验证功能要容易得多。不过,我注意到MemoryStream和NetworkStream在写入时实际上并不一样。使用MemoryStream嘲笑NetworkStream进行单元测试

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

当我写入NetworkStream时,流的另一端可以读取数据而不用调整查找指针。

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

我的问题是,什么是在MemoryStream中嘲笑相同的行为的最佳方式是什么?我想我可能只是寻找指针返回相同数量的字节我写,但似乎cludgy。另外,如果我将这些流中的几个流堆叠在一起或其他包装流,他们将如何知道指针是否需要重置?

回答

2

MemoryStream不是为您如何使用它而设计的。 NetworkStream旨在允许您用输出填充一块内存。它没有被设计成具有从原始对象正在写入的第二个对象。

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

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

听起来对我很好,我认为事情并没有太大的意义。我还没有想过网络流可能带来的潜力,谢谢。 –