用MemoryStream模拟NetworkStream进行单元测试

本文关键字:单元测试 NetworkStream MemoryStream 模拟 | 更新日期: 2023-09-27 18:10:02

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

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

当我写入一个NetworkStream时,流的另一端可以在不调整寻道指针的情况下读取该数据。

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

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

用MemoryStream模拟NetworkStream进行单元测试

MemoryStream不是为您如何使用它而设计的。一个NetworkStream被设计成允许你用你的输出来填充一块内存。它的设计目的不是让第二个对象读取原始对象正在写入的内容。

我建议你创建一个FakeNetworkStream类。您将有两个对象,写入一个对象将向另一个对象添加数据。但FakeNetworkStream的优点是,你可以实现病态套接字行为,以检测尽可能多的错误。
    在用户刷新流之前不要发送任何数据。当套接字未被刷新时,可能会出现一些细微的错误,因为实际发送数据的位置可能会有所不同。通过总是等待直到刷新,您可以在实际需要执行刷新时使测试失败。
  1. Read不能保证生成您请求的所有数据。通过每次只生成一个字节来模拟这一点。

这可能有帮助。

https://github.com/billpg/POP3Listener/commit/a73a325f21a955edd9f1023a94c586aba29cfadc diff - 80 d1609ed97fdaa9538dea7547301577cc19b6f4466a1a0a3a0ac08ad3eea23e

这个函数通过简单地打开一个服务器,连接到该服务器,并返回两端,返回两个NetworkStream对象,一个客户端和一个服务器。