给定下面使用了mockall库的测试上下文,我怎样才能满意地返回一个对cmd的引用,使我能够对随后的链接方法调用做出断言呢?

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();
    
    cmd.expect_args().times(1).returning(|_| &mut cmd);
    // results in:
    // expected `MockCmd`, found `&mut MockCmd`
    
    cmd.expect_args().times(1).returning(|_| cmd);
    // results in:
    // move occurs because `cmd` has type `tests::MockCmd`, which does not implement the `Copy` trait 
    // NOTE: I don't think I _can_ implement Copy for my struct because it's a newtype on top of Command

    cmd.expect_output()
        .times(1)
        .returning(|| Ok(create_output(0, vec![], vec![])));

    // Call the methods in the desired order
    let args = vec![String::from(":P")];
    let _x = cmd.args(&args).output();
}


推荐答案

这是不可能的,见issue #106.就像本期建议的,你可以做的最接近的事情是返回第二个MockCmd并对其设置期望值,但这确实意味着你期望调用方法的特定顺序.如果这对你来说不够好,你可以在mockall's repository中打开一个问题.

#[test]
fn test_x() {
    let mut cmd = MockCmd::new();

    cmd.expect_args().once().returning(|_| {
        let mut cmd = MockCmd::new();
        cmd.expect_output()
            .once()
            .returning(|| Ok(create_output(0, vec![], vec![])));
        cmd
    });

    // Call the methods in the desired order
    let args = vec![String::from(":P")];
    let _x = cmd.args(&args).output();
}

Rust相关问答推荐

为什么复印是豆荚的一个重要特征?

文档示例需要导入相关的 struct ,但仅在运行测试时.这是故意的行为吗?

亚性状上位性状上的 rust 病伴生型界限

当一个箱子有自己的依赖关系时,两个人如何克服S每箱1库+n箱的限制?

原始数组数据类型的默认trait实现

如何向下转换到MyStruct并访问Arc Mutex MyStruct实现的方法?

写入引用会更新基础值,但引用会打印意外的值

如何使用reqwest进行异步请求?

&'a T 是否意味着 T: 'a?

str 和 String 的 Rust 生命周期

简单 TCP 服务器的连接由对等重置错误,mio 负载较小

一个函数调用会产生双重borrow 错误,而另一个则不会

使用 HashMap 条目时如何避免字符串键的短暂克隆?

具有生命周期和以后引用的可变方法

有没有更好的方法来为拥有 DIsplay 事物集合的 struct 实现 Display?

在 Rust 中退出进程

通用类型,不同于输入类型,作为函数的返回值

编写 TOML 文件以反序列化为 struct 中的枚举

如何在没有 `make_contiguous()` 的情况下对 VecDeque 进行排序或反转?

如何制作具有关联类型的特征的类型擦除版本?