我知道该错误意味着什么,但我无法修复它。我正在用来mockers测试我的工作,在尝试验证提供给模拟特征函数的结构参数时,我陷入了困境。简化的代码:
#[cfg(test)]
extern crate mockers;
#[cfg(test)]
extern crate mockers_derive;
#[cfg(test)]
use mockers_derive::mocked;
#[derive(Ord, PartialOrd, Eq, PartialEq, Debug)]
pub struct Thing {
pub key: String,
pub class: String,
}
#[cfg_attr(test, mocked)]
pub trait DaoTrait {
fn get(&self, thing: &Thing) -> String;
}
struct DataService {
dao: Box<DaoTrait>,
}
impl DataService {
pub fn get(&self, thing: &Thing) -> String {
self.dao.get(thing)
}
}
#[cfg(test)]
mod test {
use super::*;
use mockers::matchers::eq;
use mockers::Scenario;
#[test]
fn my_test() {
use mockers::matchers::check;
let scenario = Scenario::new();
let mut dao = scenario.create_mock_for::<DaoTrait>();
let thing = Thing {
key: "my test".to_string(),
class: "for test".to_string(),
};
scenario.expect(
dao.get_call(check(|t: &Thing| t.to_owned() == thing))
.and_return("hello".to_string()),
);
let testee = DataService { dao: Box::new(dao) };
let rtn = testee.get(&thing);
assert_eq!(rtn, "hello");
}
}
Run Code Online (Sandbox Code Playgroud)
我收到错误:
#[cfg(test)]
extern crate mockers;
#[cfg(test)]
extern crate mockers_derive;
#[cfg(test)]
use mockers_derive::mocked;
#[derive(Ord, PartialOrd, Eq, PartialEq, Debug)]
pub struct Thing {
pub key: String,
pub class: String,
}
#[cfg_attr(test, mocked)]
pub trait DaoTrait {
fn get(&self, thing: &Thing) -> String;
}
struct DataService {
dao: Box<DaoTrait>,
}
impl DataService {
pub fn get(&self, thing: &Thing) -> String {
self.dao.get(thing)
}
}
#[cfg(test)]
mod test {
use super::*;
use mockers::matchers::eq;
use mockers::Scenario;
#[test]
fn my_test() {
use mockers::matchers::check;
let scenario = Scenario::new();
let mut dao = scenario.create_mock_for::<DaoTrait>();
let thing = Thing {
key: "my test".to_string(),
class: "for test".to_string(),
};
scenario.expect(
dao.get_call(check(|t: &Thing| t.to_owned() == thing))
.and_return("hello".to_string()),
);
let testee = DataService { dao: Box::new(dao) };
let rtn = testee.get(&thing);
assert_eq!(rtn, "hello");
}
}
Run Code Online (Sandbox Code Playgroud)
我查看了check源代码:
pub fn check<T, F: Fn(&T) -> bool>(f: F) -> BoolFnMatchArg<T, F> {
BoolFnMatchArg { func: f, _phantom: PhantomData }
}
Run Code Online (Sandbox Code Playgroud)
|t: &Thing| t.to_owned() == thing我认为我给出的结论是正确的。我也尝试了以下关闭方法,但没有一个起作用。
|t: &Thing| t == &thing
Run Code Online (Sandbox Code Playgroud)
|t: &Thing| *t == thing
Run Code Online (Sandbox Code Playgroud)
|t: Thing| t == thing
Run Code Online (Sandbox Code Playgroud)
Cargo.toml:
[dev-dependencies]
mockers = "0.12.1"
mockers_derive = "0.12.1"
Run Code Online (Sandbox Code Playgroud)
您不能使用 的默认派生Thing来比较 a 和 a :&ThingPartialEq
#[derive(Debug, PartialEq)]
struct Thing(String);
fn main() {
let t_val = Thing(String::new());
let t_ref = &t_val;
t_val == t_ref;
}
Run Code Online (Sandbox Code Playgroud)
#[derive(Debug, PartialEq)]
struct Thing(String);
fn main() {
let t_val = Thing(String::new());
let t_ref = &t_val;
t_val == t_ref;
}
Run Code Online (Sandbox Code Playgroud)
要修复该错误,您需要执行以下两项操作之一:
匹配参考电平:
t_val == *t_ref
&t_val == t_ref
对不匹配数量的引用实现相等:
impl<'a> PartialEq<&'a Thing> for Thing {
fn eq(&self, other: &&'a Thing) -> bool {
self == *other
}
}
impl<'a> PartialEq<Thing> for &'a Thing {
fn eq(&self, other: &Thing) -> bool {
*self == other
}
}
Run Code Online (Sandbox Code Playgroud)但是,这些都不能解决您的实际问题。您误解了嘲笑者库的工作原理;您的闭包采用了错误的参考级别,并且它需要获取要比较的值的所有权:
let expected_thing = thing.clone();
scenario.expect(
dao.get_call(check(move |t: &&Thing| t == &&expected_thing))
.and_return("hello".to_string()),
);
Run Code Online (Sandbox Code Playgroud)