生 rust 测试-如果结果对象不正常,如何详细说明失败?

7nbnzgx9  于 2022-11-12  发布在  其他
关注(0)|答案(2)|浏览(104)

我的用例非常简单--如果一个实际的对象不是一个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!的第二个参数覆盖它)

luaexgnf

luaexgnf1#

assert!可以接受多个参数,其中第二个参数是消息
https://doc.rust-lang.org/std/macro.assert.html
例如:

assert!(res.is_ok(), "Whatever you want to say or template");
zzzyeukh

zzzyeukh2#

在Rust中,当panic时,测试被认为是失败的。实际上,这就是assert!之类的宏在幕后所做的一切:评估条件,如果不满足条件,则会出现死机并显示错误消息。
Result包括unwrap和expect等方法,如果Err变量被保留,这两个方法都会死机,并将错误值作为消息,因此会导致测试失败。

相关问题