gpt4 book ai didi

testing - 如何测试标准输入和标准输出?

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

我想编写一个提示函数,将传入的字符串发送到标准输出,然后返回它从标准输入读取的字符串。我该如何测试它?

这是一个函数的例子:

fn prompt(question: String) -> String {
let mut stdin = BufferedReader::new(stdin());
print!("{}", question);
match stdin.read_line() {
Ok(line) => line,
Err(e) => panic!(e),
}
}

这是我的测试尝试

#[test]
fn try_to_test_stdout() {
let writer: Vec<u8> = vec![];
set_stdout(Box::new(writer));
print!("testing");
// `writer` is now gone, can't check to see if "testing" was sent
}

最佳答案

使用依赖注入(inject)。将它与泛型和单态结合起来,你不会失去任何性能:

use std::io::{self, BufRead, Write};

fn prompt<R, W>(mut reader: R, mut writer: W, question: &str) -> String
where
R: BufRead,
W: Write,
{
write!(&mut writer, "{}", question).expect("Unable to write");
let mut s = String::new();
reader.read_line(&mut s).expect("Unable to read");
s
}

#[test]
fn test_with_in_memory() {
let input = b"I'm George";
let mut output = Vec::new();

let answer = prompt(&input[..], &mut output, "Who goes there?");

let output = String::from_utf8(output).expect("Not UTF-8");

assert_eq!("Who goes there?", output);
assert_eq!("I'm George", answer);
}

fn main() {
let stdio = io::stdin();
let input = stdio.lock();

let output = io::stdout();

let answer = prompt(input, output, "Who goes there?");
println!("was: {}", answer);
}

在许多情况下,您实际上希望将错误传播回调用者而不是使用 expect,因为 IO 是发生故障的常见位置。


这可以从函数扩展到方法:

use std::io::{self, BufRead, Write};

struct Quizzer<R, W> {
reader: R,
writer: W,
}

impl<R, W> Quizzer<R, W>
where
R: BufRead,
W: Write,
{
fn prompt(&mut self, question: &str) -> String {
write!(&mut self.writer, "{}", question).expect("Unable to write");
let mut s = String::new();
self.reader.read_line(&mut s).expect("Unable to read");
s
}
}

#[test]
fn test_with_in_memory() {
let input = b"I'm George";
let mut output = Vec::new();

let answer = {
let mut quizzer = Quizzer {
reader: &input[..],
writer: &mut output,
};

quizzer.prompt("Who goes there?")
};

let output = String::from_utf8(output).expect("Not UTF-8");

assert_eq!("Who goes there?", output);
assert_eq!("I'm George", answer);
}

fn main() {
let stdio = io::stdin();
let input = stdio.lock();

let output = io::stdout();

let mut quizzer = Quizzer {
reader: input,
writer: output,
};

let answer = quizzer.prompt("Who goes there?");
println!("was: {}", answer);
}

关于testing - 如何测试标准输入和标准输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28370126/

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