You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 01:15:36