我有一个函数,它接受一个输入流,处理它的数据,然后返回一些东西,基本上是一个更复杂的版本:
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条答案
按热度按时间6l7fqoea1#
每个trait的文档都列出了可用的实现。下面是
BufRead
的文档页面。我们可以看到&'a [u8]
(字节片)实现了BufRead
。我们可以从一个字符串中获取一个字节片,并将该字节片的可变引用传递给read_number_from_stream
:如果不希望缓冲区包含UTF-8,或者您只关心特定的ASCII兼容字符子集,则可能希望将测试输入定义为字节字符串,而不是普通字符串。字节字符串的写法与普通字符串类似,前缀为
b
,例如:b"0\n"
。字节串的类型为&[u8; N]
,其中N
是字符串的长度。由于该类型没有实现BufRead
,我们需要将其强制转换为&[u8]
。