在字符串上创建读取流

时间:2015-10-29 23:42:03

标签: 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分支)。

1 个答案:

答案 0 :(得分:6)

每个特征的文档列出了可用的实现。 Here's the documentation page for BufRead.我们可以看到BufRead(一片字节)实现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); }

b

如果预计缓冲区不包含UTF-8,或者您只关心特定的ASCII兼容字符子集,则可能需要将测试输入定义为字节字符串,而不是普通字符串。字节字符串的写法类似于普通字符串,前缀为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); }

{{1}}