如何在单元测试中避免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类型实现了Clonetrait,可以克隆一个副本传给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
相关产品推荐
相关产品推荐

