2个版本

0.1.3 2023年10月21日
0.1.2 2023年10月21日
0.1.1 2023年10月21日
0.1.0 2023年10月21日

#417 in 测试

40 每月下载量

MIT 许可证

14KB
217

async-mock

github crates.io docs.rs

为Rust提供的异步特质模拟库。同时支持模拟非异步特质。

使用方法

async-mock通常仅用于测试。要这样做,将其添加到Cargo.toml中,如下所示

[dev-dependencies]
async-mock = "0.1.3"

然后你可以这样使用它

#[cfg(test)]
use async_mock::async_mock;
use async_trait::async_trait;

#[cfg_attr(test, async_mock)]
#[async_trait]
trait MyTrait {
    async fn foo(&self, x: i32) -> i32;
}

#[derive(Default)]
struct MyStruct;
impl MyStruct {
    async fn bar(&self, my_trait: &impl MyTrait, x: i32) -> i32 {
        my_trait.foo(x * 2).await
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[tokio::test]
    async fn some_test() {
        let mut mock = MockMyTrait::default();
        mock.expect_foo()
            .times(1)
            .returning(|x| x + 1);

        let system_under_test = MyStruct::default();
        assert_eq!(7, system_under_test.bar(&mock, 3).await);
    }
}

特质将创建一个名为Mock的模拟结构,其名称以特质的名称前缀。这个结构实现了特质及其所有函数。要设置模拟,调用expect_*函数,其中*是你想要模拟的函数名称。这会返回一个可变引用的期望对象,你可以设置模拟期望。要设置期望调用次数,可以使用once()never()times(u32)。要设置模拟返回值,调用带有与特质函数相同参数的闭包的returning。如果你的特质函数有一个包含&impl的参数,你必须调用returning_dyn而不是returning,并将你的闭包包围在一个Box<T>中。

限制

截至v0.1.3版本,async-mock不支持泛型,并硬编码依赖于async-trait,你本来就应该使用它。可能存在许多未覆盖的边缘情况,它不支持输入过滤,并且不支持在多次调用之间传递一系列函数。由于这个crate相对较新,还有很多限制。欢迎提交拉取请求!

限制的非详尽列表

  • 当模拟具有 &impl 参数的异步特性时,你必须调用 returning_dyn 而不是 returning,并将闭包放入一个 Box<T> 中。
  • 不支持从传递给 returning()returning_dyn() 的模拟闭包中调用异步函数。
  • 泛型不支持。

致谢

async-mockMockall 中汲取了大量灵感,并实际上旨在通过覆盖异步特性的用例来完成它,这是 Mockall 当前支持得不是很好的地方。《code>async-mock 旨在在异步特性方面成为 Mockall 的近似的直接替代品,但不是在所有其他方面的替代品。

依赖项

~265–710KB
~17K SLoC