如何在mockall模拟的方法中返回self以支持链式调用断言?
解决Mockall链式方法调用的断言问题
你的问题出在args方法的mock逻辑上:mockall在处理带&mut self的方法时,会自动把当前实例的可变引用传给returning闭包,你不需要手动引用外部的cmd变量,直接返回这个传入的self引用即可。
修正后的代码
mock! { Cmd {} impl CustomCommand for Cmd { fn args(&mut self, args: &[String]) -> &mut Self; fn output(&mut self) -> std::io::Result<Output>; fn spawn(&mut self) -> std::io::Result<std::process::Child>; fn status(&mut self) -> std::io::Result<ExitStatus>; } } #[test] fn test_x() { let mut cmd = MockCmd::new(); // 关键修正:使用闭包传入的self引用返回,无需外部变量 cmd.expect_args() .times(1) .returning(|this, _args| this); cmd.expect_output() .times(1) .returning(|| Ok(create_output(0, vec![], vec![]))); // 按期望顺序调用方法 let args = vec![String::from(":P")]; let _x = cmd.args(&args).output(); }
为什么这样可行?
当你mock一个带有&mut self参数的方法时,mockall生成的returning闭包会自动接收两个参数:
- 当前mock实例的可变引用
&mut Self(也就是代码里的this) - 方法定义中除了self之外的参数(这里是
&[String])
直接返回这个this引用,完全符合args方法-> &mut Self的返回类型要求,既不会触发所有权转移错误,也不会有类型不匹配的问题,完美支持后续链式调用的断言。
内容的提问来源于stack exchange,提问作者pdoherty926
相关产品推荐
相关产品推荐

