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

如何在单元测试中避免Rust的“已移动值的借用”错误?

解决Rust中因所有权移动导致的单元测试断言问题

先看你的测试代码:

let myobj = Obj::new();
let myvec:Vec<Obj> = obj_list.insert(&[myobj])?;

control = obj_list.get(myvec[0]);    
assert_eq!(control.id, myobj.id);

由于insert获取了myobj的所有权,后续无法再访问原myobj,这里提供几种可行的解决思路:

  • 提前保存需要断言的字段值
    在将myobj传入insert之前,先把要验证的id字段单独存下来,后续用这个保存的值做断言:

    let myobj = Obj::new();
    let expected_id = myobj.id; // 提前保存id
    let myvec: Vec<Obj> = obj_list.insert(&[myobj])?;
    
    let control = obj_list.get(myvec[0]);    
    assert_eq!(control.id, expected_id);
    
  • 克隆对象,保留原对象用于断言
    如果你的Obj类型实现了Clone trait,可以克隆一个副本传给insert,原对象就能继续用来做比较:

    let myobj = Obj::new();
    let myvec: Vec<Obj> = obj_list.insert(&[myobj.clone()])?;
    
    let control = obj_list.get(myvec[0]);    
    assert_eq!(control.id, myobj.id);
    
  • 直接比较取出的对象与预期值(如果Obj实现PartialEq)
    要是Obj实现了PartialEq,可以直接构造一个预期对象,或者用克隆的对象和从列表中取出的control做全量比较,而不只是比较id:

    let myobj = Obj::new();
    let expected_obj = myobj.clone();
    let myvec: Vec<Obj> = obj_list.insert(&[myobj])?;
    
    let control = obj_list.get(myvec[0]);    
    assert_eq!(control, expected_obj);
    

内容的提问来源于stack exchange,提问作者unsafe_where_true

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 19:44:57