gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:53:16 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com