7 个版本
0.1.0-beta.7 | 2020 年 6 月 2 日 |
---|---|
0.1.0-beta.6 | 2020 年 6 月 1 日 |
#571 in 测试
12KB
188 代码行
covers
轻量级库,允许在 Rust 中模拟函数
包
https://crates.io/crates/covers
用法
use covers::{mocked, mock};
#[mocked(mock_foo)]
fn foo(name: &str) -> String {
format!("Response: Foo = {}", name)
}
fn mock_foo(another_name: &str) -> String {
format!("Response: Mocked(Foo = {})", another_name)
}
#[mocked(module::mock_bar)]
fn bar(name: &str) -> String {
format!("Response: Bar = {}", name)
}
pub struct Struct {}
mod module {
use super::*;
#[mock]
pub fn mock_bar(name: &str) -> String {
let original_function_result = _bar(name);
format!("Response: Mocked({})", original_function_result)
}
pub fn yyy(this: Struct, name: &str) -> String {
format!("Response: Mocked({})", name)
}
}
impl Struct {
#[mocked(Struct::mock_baz, scope = impl)]
fn baz(name: &str) -> String {
format!("Response: Baz = {}", name)
}
fn mock_baz(name: &str) -> String {
format!("Response: Baz = {}", name)
}
#[mocked(module::yyy)]
fn xxx(self, name: &str) -> String {
format!("Response: Baz = {}", name)
}
}
注意事项
使用案例
-
您可以使用
#[mocked(mock_fn)]
模拟所有类型的函数- 内联函数(包括模块内的函数)
- 结构体函数(在这种情况下,您需要使用
scope = impl
提示宏) - 结构体变体函数(使用
this: Struct
或_self: Struct
作为第一个参数,而不是self
)
-
您可以手动创建和存储模拟函数
- 内联
- 在独立的模块中(包括
#[cfg(test)] mod tests {}
) - 在结构体实现块中
请注意
-
scope = impl
提示对于静态结构体函数/静态方法是必需的 -
对于具有第一个参数
self
的结构体变体函数,不需要添加scope = impl
,它将自动为所有函数设置 -
#[mock]
让编译器知道这段代码不应该用于发布构建。否则,它将创建相关函数
pub
。您可以通过为crate的features
传递no-pub
来禁用此逻辑。 -
在内部使用原始函数的引用时,必须严格使用
#[mock]
。通常,它是前面带有下划线_
的同名函数。否则,发布构建可能会失败。 -
您可以通过在
Cargo.toml
的[dependencies]
块中使用features=["__"]
或features=["_orig_"]
来更改原始函数的前缀。一个下划线是默认值 -"_"
已知问题
- 更新:如果您在测试中依赖于调用
_original_function()
的mock,请注意:使用cargo test --release
可能会导致意外结果或断言错误 - 原因是没有启用#[cfg(debug_assertions)]
。考虑重构测试、缩小范围或避免使用原始函数。
注意:您可以在这里找到大量的使用示例 - 在集成测试的crate中。