我正在尝试使用fmt :: Display打印枚举(或结构)。虽然代码编译并获取显示方法,但它不会打印该值。
pub enum TestEnum<'a> {
Foo(&'a str),
Bar(f32)
}
impl<'b> fmt::Display for TestEnum <'b> {
fn fmt(&self, f : &mut fmt::Formatter) -> fmt::Result {
println!("Got this far");
match self{
&TestEnum::Foo(x) => write!(f,"{}",x),
&TestEnum::Bar(x) => write!(f,"{}",x),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_print() {
let cell = TestEnum::Str("foo");
println!("Printing");
println!("{}",cell); // No output here
}
}
我尝试使用{:?}和{},但无济于事。
答案 0 :(得分:5)
这是因为Rust测试程序隐藏了成功测试的标准。您可以通过以下方式禁用此行为 - 传递--nocapture选项以测试二进制或货物测试命令:
cargo test -- --nocapture
PS:您的代码已损坏/不完整
答案 1 :(得分:1)
试验跑者似乎转移了标准输出;您应该考虑使用TableModel
,assert!
或其他恐慌的方法来测试您的断言,而不是在测试中打印。
此外,由于名称不匹配,您的代码无法编译。我按照预期从主要工作:
assert_eq!
答案 2 :(得分:1)
当测试成功时,测试输出被重定向到一个缓冲区,以免在测试中失败,并且#34; FAILED&#34;或者&#34;确定&#34;消息。
如果您只是想在开发测试时测试某些内容,则可以在测试结束时始终添加panic!()
,以确保它始终失败并输出所有日志记录。或者@AndreaP在他的回答中指出,您可以使用cargo test -- --nocapture
来显示所有测试的标准输出。
通常测试不应该写入stdout,而是写入缓冲区并检查该缓冲区是否包含它应该包含的内容:
let cell = TestEnum::Foo("foo");
let mut buf = Vec::new();
let _ = write!(buf, "{}\n", cell);
assert_eq!(&buf, b"foo\n");
如果你真的想要输出一些内容,你需要直接写入stdout。
let _ = write!(io::stdout(), "{}\n", cell);
但这会与测试的输出结合:
test tests::blub ... foo
ok