【发布时间】:2019-04-22 07:12:40
【问题描述】:
总结
我有一个应用程序启动另一个进程并使用log crate 将其 StdOut/StdErr 传输到日志文件。我的应用程序逐行传输输出 (buf_read.read_line())。由于它可以是任意进程,我的应用程序假设其他进程可能是恶意的,并且可能会尝试在没有单个换行符的情况下将大量数据打印到 stdout/sterr,从而导致我的应用程序中出现 OOM。因此,我的应用程序限制了 BufReader 使用 BufReader.take() 一次可以读取的字节数。
问题
忽略有关分块输入的所有细节,我如何测试我的记录器是否使用正确的参数被调用 X 次?假设我的应用程序已经读取了一大行并将其拆分为 3 个部分,如下面的 MCVE。
MCVE:
use std::thread::JoinHandle;
fn main() {
let handle = start_transfer_thread(&|x| {
println!("X={}", x);
}).join();
}
fn start_transfer_thread<F>(logger: &'static F) -> JoinHandle<()> where F: Send + Sync + Fn(&str) -> () {
std::thread::spawn(move || {
logger("1");
logger("2");
logger("3");
})
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_logged_in_order() {
let result = start_transfer_thread(&|x| {
match x {
"1" => (),
"2" => (),
"3" => (),
x => panic!("unexpected token: {}", x)
}
}).join();
assert!(result.is_ok());
}
}
【问题讨论】:
-
为什么不用长输入来测试你的代码并检查结果???!!!
-
我这样做了,我知道它有效,但我想要一个自动化测试。手动测试不是一种选择。
-
您可以从 trait 对象中获取记录器并将其注入为实现相同 trait 的模拟记录器。在您的模拟记录器中,您可以添加所需的逻辑并从中获取调用计数。
-
我知道
spy是什么,问题是如何用普通的锈迹做到这一点。最后,我用特征对象替换了函数/闭包。现在在测试中,我可以通过另一个使用通道累积值的实现。但我仍然不知道如果是我的 MCVE 中的函数/闭包,该怎么做。
标签: rust