Unit testing 当'Result'不是'Copy'时设计单元测试`
我有一个容器类型的单元测试,我正在实现:Unit testing 当'Result'不是'Copy'时设计单元测试`,unit-testing,design-patterns,data-structures,rust,traits,Unit Testing,Design Patterns,Data Structures,Rust,Traits,我有一个容器类型的单元测试,我正在实现: #[测试] fn测试获取多个正常尾部()->结果{ 让mut actual_list:ArrayList=ArrayList::new(); 让列表:ArrayList=ArrayList{ 元素:向量![1,2,3,8], }; 实际清单。附加(1)?; 实际清单。附加(2)?; 实际清单。附加(3)?; 实际清单。附加(4)?; 让实际结果:结果=实际列表。获取(3); 让预期结果为:结果=正常(&mut 4); 设elem=实际分辨率展开(); *
#[测试]
fn测试获取多个正常尾部()->结果{
让mut actual_list:ArrayList=ArrayList::new();
让列表:ArrayList=ArrayList{
元素:向量![1,2,3,8],
};
实际清单。附加(1)?;
实际清单。附加(2)?;
实际清单。附加(3)?;
实际清单。附加(4)?;
让实际结果:结果=实际列表。获取(3);
让预期结果为:结果=正常(&mut 4);
设elem=实际分辨率展开();
*元素*=2;
assert_eq!(实际_列表、预期_列表);
断言(实际值、预期值);
好(())
}
但是,rustc
投诉:
error[E0382]: borrow of moved value: `actual_res`
--> src\arraylist.rs:358:9
|
351 | let actual_res: Result<&mut u64, ListError> = actual_list.get_mut(3);
| ---------- move occurs because `actual_res` has type `std::result::Result<&mut u64, list::ListError>`, which does not implement the `Copy` trait
...
354 | let elem = actual_res.unwrap();
| ---------- value moved here
...
358 | assert_eq!(actual_res, expected_res);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ value borrowed here after move
|
= note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)
ArrayList::get_mut()
的代码如下(如果相关):
fn获取_mut(&mut self,pos:usize)->结果{
如果pos>=self.elems.len(){/*边界检查*/
返回Err(listerrror::OutOfBounds);
}
匹配自我要素获取信息(位置){
一些(元素)=>Ok(元素),
None=>Err(ListError::OutOfBounds)
}
}
总之,我有两个问题:
&mut u64
实际上并不实现复制<代码>&mut T无法实现复制以防止同时创建多个可变借用
参考文件:
在回答1时,您可以使用assert\u eq!(elem,4)代码>而不是断言!(实际的,预期的)代码>。或者可以使用Result::map
修改并返回新结果
let actual_res: Result<&mut u64, ListError> = actual_list.get_mut(3).map(|elem| {
*elem *= 2;
elem
};
let actual_res:Result=actual_list.get_mut(3).map(| elem |{
*元素*=2;
元素
};
移动断言的问题在于,我试图测试的部分内容是,列表中的元素可以通过数组列表::get_mut
返回的mut u64
进行操作(注意预期_list
是向量![1,2,3,8]
而不是向量![1,2,3,4]
,它将匹配ArrayList::append
调用的顺序).你是对的;我错过了这一点。我可以看到两种解决方法。你可以直接将elem
值与4进行比较。你还可以使用Result::map
函数修改并返回内部值,并得到一个新结果,与预期结果进行比较,因此更新后的解决方案修复了原始帖子的错误错误,但现在我仍然面临可变和不可变借用的顺序问题(导致我认为我的问题主要是测试设计,而不是特定语法)。