#mocking #function #fn #cover #rust

covers

轻量级库,允许在 Rust 中模拟函数

7 个版本

0.1.0-beta.72020 年 6 月 2 日
0.1.0-beta.62020 年 6 月 1 日

#571 in 测试

自定义许可证

12KB
188 代码行

Rust

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_"] 来更改原始函数的前缀。一个下划线是默认值 - "_"

已知问题

  1. 更新:如果您在测试中依赖于调用 _original_function() 的mock,请注意:使用 cargo test --release 可能会导致意外结果或断言错误 - 原因是没有启用 #[cfg(debug_assertions)]。考虑重构测试、缩小范围或避免使用原始函数。

注意:您可以在这里找到大量的使用示例 - 在集成测试的crate中。

无运行时依赖

特性