unit-testing - 通过字符串创建读取流

标签 unit-testing rust

我有一个函数接受一个输入流,处理它的数据,然后返回一些东西,基本上是一个更复杂的版本:

fn read_number_from_stream(input: &mut io::BufRead) -> io::Result<u32> {
  // code that does something useful here
  Ok(0)
}

现在我想为这个函数写一个测试。

#[test]
fn input_with_zero_returns_zero() {
  let test_input = read_from_string("0\n");
  assert_eq!(Ok(0), read_number_from_stream(test_input));
}

如何实现 read_from_string?旧版本的 Rust 显然提供了 std::io::mem::MemReader,但整个 std::io::mem 模块似乎在较新的版本中消失了Rust 的(我使用的是不稳定的 1.5 分支)。

最佳答案

每个特征的文档列出了可用的实现。 Here's the documentation page for BufRead.我们可以看到&'a [u8](一个 byte slice 段)实现了BufRead。我们可以从字符串中获取 byte slice 段,并将对该片段的可变引用传递给 read_number_from_stream:

use std::io;

fn read_number_from_stream(input: &mut io::BufRead) -> io::Result<u32> {
    // code that does something useful here
    Ok(0)
}

fn read_from_string(s: &str) -> &[u8] {
    s.as_bytes()
}

fn main() {
    let mut test_input = read_from_string("0\n");
    read_number_from_stream(&mut test_input);
}

如果缓冲区不应包含 UTF-8,或者您只关心特定的 ASCII 兼容字符子集,您可能希望将测试输入定义为字节字符串,而不是普通字符串。字节串的写法与普通字符串一样,以 b 为前缀,例如b"0\n"。字节串的类型是&[u8; N],其中 N 是字符串的长度。由于该类型未实现 BufRead,我们需要将其转换为 &[u8]

fn main() {
    let mut test_input = b"0\n" as &[u8];
    read_number_from_stream(&mut test_input);
}

关于unit-testing - 通过字符串创建读取流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33426571/

相关文章:

module - 在 Rust 中,mod.rs 文件的用途是什么?

rust - 如何从单击按钮的条目中获取信息?

rust - 选择动态创建的 channel

Docker 忽略 `--platform` 中的 `Dockerfile` 标志

error-handling - Rust——如何精确优雅地处理错误?

visual-studio-2008 - 在 TDD 中,甚至在编写空方法之前运行测试有什么好处?

python - 如何使用日志记录、pytest fixture 和 capsys?

javascript - react 状态没有 Jest 更新

python - 列表理解中的测试和断言

ios - 类平等的单元测试