如何让Rust中的assert_eq!显示多行字符串
让Rust单元测试的多行字符串对比输出分行显示的方法
方法一:使用pretty_assertions crate
这是最简便的方案,该 crate 会自动格式化多行字符串的对比输出,让差异一目了然。
- 添加依赖
在Cargo.toml的dev-dependencies中加入:
[dev-dependencies] pretty_assertions = "1.4.0" # 可替换为最新稳定版本
- 修改测试代码
引入 crate 中的assert_eq并替换默认断言:
use pretty_assertions::assert_eq; #[test] fn test_multiline_strings_are_equal() { let expected = "\ one two three four "; let actual = "\ one two four "; assert_eq!(actual, expected); }
测试失败时的输出会自动分行展示:
---- printer::tests::test_multiline_strings_are_equal stdout ---- thread 'printer::tests::test_multiline_strings_are_equal' panicked at 'assertion failed: `(left == right)` left: ` one two four ` right: ` one two three four `', src\printer.rs:600:9
方法二:自定义多行断言函数
如果不想引入额外依赖,可以手动实现一个断言函数,直接打印分行的字符串内容:
fn assert_multiline_eq(actual: &str, expected: &str) { if actual != expected { panic!( "多行字符串不匹配:\n\n实际内容:\n{}\n\n预期内容:\n{}", actual, expected ); } } #[test] fn test_multiline_strings_are_equal() { let expected = "\ one two three four "; let actual = "\ one two four "; assert_multiline_eq(actual, expected); }
失败时的输出示例:
---- printer::tests::test_multiline_strings_are_equal stdout ---- thread 'printer::tests::test_multiline_strings_are_equal' panicked at '多行字符串不匹配: 实际内容: one two four 预期内容: one two three four ', src\printer.rs:600:9
内容的提问来源于stack exchange,提问作者Huw Walters
相关产品推荐
相关产品推荐

