Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用MemoryStream模拟用于单元测试的网络流_C#_Unit Testing_Stream - Fatal编程技术网

C# 用MemoryStream模拟用于单元测试的网络流

C# 用MemoryStream模拟用于单元测试的网络流,c#,unit-testing,stream,C#,Unit Testing,Stream,我有一个类正在包装一个流,其目的是使该流很可能是一个NetworkStream。然而,在单元测试中,使用MemoryStream来验证功能要容易得多。然而,我注意到MemoryStream和NetworkStream实际上在写操作上的作用并不相同 当我写入MemoryStream时,流的seek指针被设置为我所写内容的末尾。为了读出我写的内容,我必须将Seek指针调整回我写的内容的开头 当我写入网络流时,流的另一端可以读取该数据,而无需调整seek指针 我假设NetworkStream在内部处理

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

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

当我写入网络流时,流的另一端可以读取该数据,而无需调整seek指针

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


那么我的问题是,在MemoryStream中模仿同样行为的最佳方式是什么?我想我可能只是把指针找回到我写的相同字节数,但这似乎很难。另外,如果我将这些流或其他包装流堆叠在一起,它们如何知道指针是否需要重置?

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

我建议您创建一个FakenNetworkStream类。您将有两个对象,写入其中一个对象将向另一个对象添加数据。但是FakenNetworkStream的优点是,您可以实现病理套接字行为来检测尽可能多的bug

  • 在用户刷新流之前,不要发送任何数据。当套接字未刷新时,可能会出现细微的错误,因为实际发送数据的位置可能不同。如果总是等到刷新,那么当确实需要刷新时,您的测试可能会失败
  • Read不能保证生成您请求的所有数据。通过一次只生成一个字节来模拟这种情况
    听起来不错,我觉得事情并不像现在这样有意义。谢谢,我还没有想到网络流会带来哪些潜在的shinangins。