Unit testing 如何测试特定的锈蚀错误?

Unit testing 如何测试特定的锈蚀错误?,unit-testing,testing,error-handling,rust,Unit Testing,Testing,Error Handling,Rust,我可以找到方法来检测生锈是否给了我一个错误 assert!(fs::metadata(path).is_err()) 如何测试特定错误?如果返回的Err变量impl Debug+PartialEq,则可以直接比较该变量: #[derive(Debug, PartialEq)] enum MyError { TooBig, TooSmall, } pub fn encode(&self, decoded: &'a Bytes) -> Result<

我可以找到方法来检测生锈是否给了我一个错误

assert!(fs::metadata(path).is_err())


如何测试特定错误?

如果返回的
Err
变量
impl Debug+PartialEq
,则可以直接比较该变量:

#[derive(Debug, PartialEq)]
enum MyError {
    TooBig,
    TooSmall,
}

pub fn encode(&self, decoded: &'a Bytes) -> Result<&'a Bytes, MyError> {
    if decoded.len() > self.length() as usize {
        Err(MyError::TooBig)
    } else {
        Ok(&decoded)
    }
}

以下解决方案不需要实现
PartialEq
trait。例如,
std::io::Error
没有实现这一点,需要更通用的解决方案

在这些情况下,您可以从中借用宏
assert\u matches
。它的工作原理是提供更简洁的模式匹配方式,宏非常短,您也可以键入它:

macro\u规则!断言错误{
($expression:expr,$($pattern:tt)+)=>{
匹配$expression{
$($模式)+=>(),
ref e=>panic!(“预期为`{}`但得到`{:?}`)”,stringify!($($pattern)+),e),
}
}
}
//示例用法:
断言你错了!(您的_func(),Err(Error::urlparsingfiled());
断言你错了!(您的_func(),Err(Error::规范化失败());
断言你错了!(如果er.kind()==ErrorKind::NotFound,则您的_func(),Err(Error::FileOpenFailed(er));
完整的游乐场可构建示例,示例
Error
enum:

#[派生(调试)]
发布枚举错误{
创建失败,
规范化失败(std::io::Error),
FileOpenFailed(标准::io::错误),
UrlParsingFailed(url::ParseError),
}
发布您的_func()->结果{
好(())
}
#[cfg(测试)]
模试验{
使用std::io::ErrorKind;
使用super::{your_func,Error};
宏\u规则!断言\u错误{
($expression:expr,$($pattern:tt)+)=>{
匹配$expression{
$($模式)+=>(),
ref e=>panic!(“预期为`{}`但得到`{:?}`)”,stringify!($($pattern)+),e),
}
}
}
#[测试]
fn测试失败(){
//以下是几个例子:
assert_err!(您的_func(),err(Error::urlparsingfiled());
assert_err!(您的_func(),err(Error::CanonicalizationFailed(u));
如果er.kind()==ErrorKind::NotFound,则断言(您的\u func(),err(Error::FileOpenFailed(er));
}
}

使用
结果
获取
选项
。err
-为什么不直接比较?@Shepmaster
选项
不是
结果
的变体。不知道我是否理解你的问题。昨天刚开始编程,所以可能缺少一些明显的东西为什么不与
Err(MyError::TooBig)
比较?当我尝试获取
预期的枚举'std::result::result',发现枚举'fixed::Error'
Err(MyError::TooBig)
MyError::TooBig
不同,你可以使用宏#[应该恐慌]. 你可以去看看
assert_eq!(fixed.encode(&[1]), Err(MyError::TooBig));