当两个字符串不相等时,assert_eq 宏是否可以显示差异?

Dav*_*ers 5 macros unit-testing assert rust rust-cargo

我正在为语言标记器编写一些测试,并将标记器生成的标记化的 JSON 序列化版本与已知良好标记化的序列化进行比较。所以我有一些这样的测试:

#[test]
fn test_tokenize() {
    let actual_token_json = /* string */;
    let expected_token_json = /* string */;

    assert_eq!(actual_token_json, expected_token_json);
}
Run Code Online (Sandbox Code Playgroud)

但是,当这些测试失败时,cargo test只是说 JSON 字符串不相等并将它们都打印出来,这不是很有用。由于 JSON 字符串都打印得很漂亮,如果cargo test打印出两个字符串的行差异会更有帮助。有什么办法可以做到这一点吗?

更新:有人编辑了这篇文章的标题,但删除了一条重要信息:当两个字符串不相等时,我正在寻找差异。我在这里看到的答案之一是针对更一般的问题,即在两个值不相等时获取两个值的调试表示的字符差异。这要么超过我需要的,要么不是我需要的。例如,两个字符串的调试表示的差异不会给我一个行差异,而是一个大的、复杂的字符差异(因为这些行在调试表示中显示为转义的“\n”标记)。

Pet*_*aro 6

是的,但不是使用assert_eq标准库提供的宏。您可以使用pretty_assertions专为满足您的需求而设计的板条箱。

差异


实际上,内置宏可以使用两个以上的参数,通过使用自定义消息对其进行扩展来提供有关断言的更多信息。因此,从技术上讲,如果您自己或外部提供某种差异实现,即DisplayDebug,则可以将其传递给宏。严格来说,这个宏在某些方面也适用于这样的事情。