使用fmt :: Display进行打印

时间:2015-06-12 12:07:57

标签: printing rust

我正在尝试使用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
    }
}

我尝试使用{:?}和{},但无济于事。

3 个答案:

答案 0 :(得分:5)

这是因为Rust测试程序隐藏了成功测试的标准。您可以通过以下方式禁用此行为 - 传递--nocapture选项以测试二进制或货物测试命令:

cargo test -- --nocapture

PS:您的代码已损坏/不完整

答案 1 :(得分:1)

试验跑者似乎转移了标准输出;您应该考虑使用TableModelassert!或其他恐慌的方法来测试您的断言,而不是在测试中打印。

此外,由于名称不匹配,您的代码无法编译。我按照预期从主要工作:

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

PlayPen