Rust测试报错dyn std::error::Error无相等比较实现的解决方案
报错原因
assert_eq! 宏比较两个值时,要求两个值的类型必须实现 PartialEq 特征。
你的函数返回类型是 Result<ParsingResult<'a>, Box<dyn std::error::Error>>,虽然你给 ParsingResult 派生了 PartialEq,但特征对象 dyn std::error::Error 本身没有实现 PartialEq,因此包裹它的 Box<dyn std::error::Error>、以及最终的 Result 类型都不满足相等比较的要求,编译器直接抛出错误。
修复方案
选以下任意一种即可:
- 方案1:测试中不直接比较整个Result,拆分判断逻辑(最简单,无需改动业务代码)
把测试代码改成如下形式,先确认返回结果是Ok变体,再取出内部值和预期值比较:#[cfg(test)] mod templates_tests { use super::*; #[tokio::test] async fn make_it_work() { let res = yahoo_template("https://ro.wikipedia.org/wiki/Guy_de_Maupassant").await; // 先断言请求和解析没有报错 assert!(res.is_ok()); let parsed = res.unwrap(); // 分别对比结构体字段 assert_eq!(parsed.title, "Title"); assert_eq!(parsed.content, String::from("String")); } } - 方案2:替换错误类型为实现了PartialEq的自定义错误
如果你确实需要直接对比整个Result,可以定义自己的错误枚举,给枚举派生PartialEq,替换掉原来的Box<dyn std::error::Error>作为返回错误类型。这种方式适合需要明确枚举所有错误场景的正式项目,简单测试场景用方案1即可。
额外提示:你当前的函数生命周期标注存在潜在问题。现在返回的
title是硬编码的字符串字面量('static生命周期)所以暂时编译通过,后续如果改成从爬取的响应文本中切片提取title,会出现悬垂引用问题——因为响应文本resp是函数内部的临时变量,函数返回后内存会被释放,基于它的切片引用会失效。这种场景下要么把title字段改成String类型持有所有权,要么把响应文本的生命周期和返回结果绑定。
内容的提问来源于stack exchange,提问作者user12601679
相关产品推荐
相关产品推荐

