2个版本
0.1.3 | 2023年10月21日 |
---|---|
0.1.2 | 2023年10月21日 |
0.1.1 |
|
0.1.0 |
|
#417 in 测试
40 每月下载量
14KB
217 行
async-mock
为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-mock
从 Mockall 中汲取了大量灵感,并实际上旨在通过覆盖异步特性的用例来完成它,这是 Mockall 当前支持得不是很好的地方。《code>async-mock 旨在在异步特性方面成为 Mockall 的近似的直接替代品,但不是在所有其他方面的替代品。
依赖项
~265–710KB
~17K SLoC