You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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闭包会自动接收两个参数:

  1. 当前mock实例的可变引用&mut Self(也就是代码里的this)
  2. 方法定义中除了self之外的参数(这里是&[String])

直接返回这个this引用,完全符合args方法-> &mut Self的返回类型要求,既不会触发所有权转移错误,也不会有类型不匹配的问题,完美支持后续链式调用的断言。

内容的提问来源于stack exchange,提问作者pdoherty926

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 23:15:14