我的用例非常简单--如果一个实际的对象不是一个Ok变量,我希望这个测试显式地失败,显示它包含的内容:
fn test_foo() {
let actual = fn_that_returns_result();
// not verbose enough in case it is actually an Err:
// assert!(res.is_ok());
}
我不能在这里做一个精确的比较,因为Ok变体的内部状态是动态的。
下面的方法有点工作,但我想知道它是否好,或者也许有一个更惯用的解决方案?
fn test_foo() {
let actual = fn_that_returns_result();
match res {
Ok(_) => {},
Err(err) => panic!("{}", err) // anyhow::Error
}
}
更新:为了清楚起见,我希望原始错误保持不变,而不是在assert中被覆盖(因此不能使用.expect
或通过assert!
的第二个参数覆盖它)
2条答案
按热度按时间luaexgnf1#
assert!
可以接受多个参数,其中第二个参数是消息https://doc.rust-lang.org/std/macro.assert.html
例如:
zzzyeukh2#
在Rust中,当panic时,测试被认为是失败的。实际上,这就是
assert!
之类的宏在幕后所做的一切:评估条件,如果不满足条件,则会出现死机并显示错误消息。Result
包括unwrap和expect等方法,如果Err
变量被保留,这两个方法都会死机,并将错误值作为消息,因此会导致测试失败。