我怎样才能让assert_eq! 在 Rust 中显示多行字符串

Huw*_*ers 4 rust

我有以下 Rust 单元测试:

    #[test]
    fn test_multiline_strings_are_equal() {
        let expected = "\
one
two
three
four
";
        let actual = "\
one
two
four
";
        assert_eq!(actual, expected);
    }
Run Code Online (Sandbox Code Playgroud)

当失败时,会输出以下内容:

---- printer::tests::test_multiline_strings_are_equal stdout ----
thread 'printer::tests::test_multiline_strings_are_equal' panicked at 'assertion failed: `(left == right)`
  left: `"one\ntwo\nfour\n"`,
 right: `"one\ntwo\nthree\nfour\n"`', src\printer.rs:600:9
Run Code Online (Sandbox Code Playgroud)

谁能告诉我如何让它在不同的行上显示“一”、“二”、“三”和“四”,以便于比较?

Kev*_*eid 7

图书馆pretty_assertions就是这么做的。只需添加

use pretty_assertions::assert_eq;
Run Code Online (Sandbox Code Playgroud)

其替换assert_eq!宏将产生逐行差异;在你的例子中:

Diff < left / right > :
 one
 two
>three
 four
Run Code Online (Sandbox Code Playgroud)

它也适用于Debug非字符串值的输出:

Diff < left / right > :
 one
 two
>three
 four
Run Code Online (Sandbox Code Playgroud)
Diff < left / right > :
 Foo {
     x: "x",
<    y: "y",
>    y: "surprise!",
 }
Run Code Online (Sandbox Code Playgroud)