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
    函数修改并返回内部值,并得到一个新结果,与
    预期结果进行比较,因此更新后的解决方案修复了原始帖子的错误错误,但现在我仍然面临可变和不可变借用的顺序问题(导致我认为我的问题主要是测试设计,而不是特定语法)。