使用TcpStream测试组件

4
我创建了一个组件,它创建一个std::net::TcpStream并在其生命周期内读取和写入。现在我想为它编写测试;它是否连接到正确的地址?它是否发送了正确的数据?它能否处理接收到的无效数据?然而,由于我只开始使用Rust,大概才三天左右,我不确定如何继续。在Java中(我已经用Java做了比Rust长得多的时间),我至少有以下几种可能性:
  1. 创建一个测试TCP服务器来收集发送到它的数据并控制回送什么。
  2. 将I/O操作提取为trait,为TcpStreamTestTcpStream实现该trait,并在测试期间使用TestTcpStream

Rust还提供了其他一些我还不知道的东西吗?

(稍微澄清一下:我不是寻找如何执行这些操作,我可能可以弄清楚,我正在寻找的是除我列出的两个之外的更多可能性。)


1
对于第一个问题,你可能想要检查std::net::TcpListener,它为每个连接提供了一个TcpStream。对于第二个问题,TcpStream已经实现了std::io::Writestd::io::Read特性,你可以期望使用这些特性而不是具体的TcpStream来处理你的IO逻辑。 - undefined
Rust提供了我还不知道的其他功能吗?除了用于指定常见行为的特质之外,没有什么特别的。由于TcpStream实现了ReadWrite接口,只需按照这个问题中给出的建议进行操作即可。 - undefined
好的,ReadWrite肯定是可行的选项,但这仍然需要我创建TcpStream。通常情况下,我会使用工厂模式来解决这个问题,在Rust中是否也被认为是惯用的呢?:) - undefined
不,你应该让你的逻辑依赖于实现了ReadWrite接口的对象。从那里开始,你可以通过提供另外一个提供这两个字节通道的对象来“模拟”TCP流。 - undefined
是的,我意识到了那一部分,但我正在编写的库应该负责创建TCP流,所以我需要使测试也能够访问那一部分。 - undefined
你可以创建一个线程来运行你的代码,在主线程中监听连接并检查一切是否正确。 - undefined
1个回答

0
不确定这是否有帮助,因为问题有点宽泛,但是你可以使用VecDeque(双端队列)来模拟一个TcpStream。这是可行的,因为TcpStreamVecDeque都实现了ReadWrite特性,所以你可以将VecDeque插入到某些函数中,而不是TcpStream来进行测试。
所以,不要这样做:
fn do_something(
  mut stream: &mut TcpStream,
) {
  // Do something with the TCP Stream
  // (Reads, writes, and other TCP Stream functionalities
}

将参数更改为以下内容:
fn do_something<S: std::io::Write + std::io::Read>(
  mut stream: &mut S,
) {
  // Do something with the generic stream
  // (only reads & writes)
}

现在这个函数接受一个 TcpStreamVecDeque,但是后者更容易进行模拟和测试,因为你不需要设置服务器监听器,也不需要使用正确的端口连接到它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接