#mocking #generator #test

moq_derive

Mock 生成器(宏实现)

4 个版本 (2 个破坏性版本)

0.3.1 2022年4月15日
0.3.0 2022年4月15日
0.2.0 2022年4月11日
0.1.0 2022年4月7日

206#mocking

Download history • Rust 包仓库 80/week @ 2024-03-31 • Rust 包仓库 34/week @ 2024-04-07 • Rust 包仓库 96/week @ 2024-04-14 • Rust 包仓库 42/week @ 2024-04-21 • Rust 包仓库 3/week @ 2024-04-28 • Rust 包仓库 2/week @ 2024-05-05 • Rust 包仓库 43/week @ 2024-05-12 • Rust 包仓库 75/week @ 2024-05-19 • Rust 包仓库 30/week @ 2024-05-26 • Rust 包仓库 37/week @ 2024-06-02 • Rust 包仓库 45/week @ 2024-06-09 • Rust 包仓库 65/week @ 2024-06-16 • Rust 包仓库 48/week @ 2024-06-23 • Rust 包仓库 62/week @ 2024-06-30 • Rust 包仓库 2/week @ 2024-07-07 • Rust 包仓库 14/week @ 2024-07-14 • Rust 包仓库

每月132 次下载
用于 moq

MIT/Apache

60KB
1.5K SLoC

Moq

crates.io docs.rs build

此库提供宏,提供实现 trait 的 mock 结构体生成。

[dependencies]
moq = "0.3"

使用示例

#[moq::automock]
trait Trait {
    fn func(&self, arg: i64) -> String;
}

#[test]
fn test_ok() {
    let mock = TraitMock::new()
        .expect_func(|arg: i64| {
            assert_eq!(arg, 42);
            format!("Hello, {}", arg)
        })
        .expect_func(|arg: i64| {
            assert_eq!(arg, -1);
            format!("Hello again, {}", -1)
        });
    
    mock.func(42);
    mock.func(-1);
}

#[test]
fn test_failed_extra_call() {
    let mock = TraitMock::new()
        .expect_func(|arg: i64| {
            assert_eq!(arg, 42);
            format!("Hello, {}", arg)
        });

    mock.func(42);
    mock.func(-1); // Panic here
}

#[test]
fn test_failed_missing_call() {
    let mock = TraitMock::new()
        .expect_func(|arg: i64| {
            assert_eq!(arg, 42);
            format!("Hello, {}", arg)
        })
        .expect_func(|arg: i64| {
            assert_eq!(arg, -1);
            format!("Hello again, {}", -1)
        });

    mock.func(42);
    // Panic here
}

async_trait 也可以使用,但主要限制是在 async_trait 之上指定 automock

#[moq::automock]
#[async_trait::async_trait]
trait Trait {
    async fn func(&self, arg: i64) -> String;
}

#[tokio::test]
async fn test_ok() {
    let mock = TraitMock::new()
        .expect_func(|arg: i64| async {
            assert_eq!(arg, 42);
            format!("Hello, {}", arg)
        });
    
    mock.func(42).await;
}

您可以在测试中找到更多示例。

待办事项

  • 支持泛型函数
  • 支持静态函数
  • moq::mock!(..) 用于生成外部 trait 的 mock 结构体
  • 为没有 trait 的结构体生成 mock 结构体
  • moq::lambda! 中捕获环境

许可证

根据您的选择,许可协议为 Apache 许可协议第 2 版MIT 许可证
除非您明确说明,否则根据 Apache-2.0 许可证定义的任何贡献,均将双重许可,如上所述,无需任何附加条款或条件。

依赖关系

~2MB
~43K SLoC