有很多教程展示如何在Rust中编写单元测试。我已经阅读了数十篇,它们都专注于在成功的情况下断言值。但是,在出现error
的情况下,情况似乎并不那么简单。错误默认情况下不实现PartialEq
trait,因此您无法使用assert_eq!
宏。此外,某些函数可能会返回多个错误变体,这取决于发生了什么样的问题(例如io::Error
可以是不同类型的错误)。我只能检查是否发生了错误,但这似乎不够。
以下是示例。
fn parse_data(input: i32) -> Result<i32, io::Error> {
match input {
0 => Ok(0),
_ => Err(io::Error::new(io::ErrorKind::InvalidData, "unexpected number"))
}
}
#[test]
fn test_parsing_wrong_data() {
let result = parse_data(1);
assert!(result.is_err());
let got = result.unwrap_err();
let want = io::Error::new(io::ErrorKind::InvalidData, "unexpected number");
// compilation error here: binary operation `==` cannot be applied to type `std::io::Error`
assert_eq!(want, got);
}
我认为这不是惯用的方法,因为它没有编译。因此问题是 - 在类似情况下什么是适当和惯用的方法?
Result<String, ParseError>
的函数,我给ParseError
添加了#[derive(PartialEq)]
,然后它就可以工作了! - grooveplexassert_eq!
的第一个或第二个参数没有任何意义。这就是为什么失败文本将它们称为“left”和“right”的原因。 - Shepmaster.kind()
,即如果使用thiserror
crate,请使用 @scoopr 的答案。 - Sam Myers.kind()
部分只是针对OP具体情况的,sccopr的回答对我来说不够清楚。 - Stargateur