#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 80/week @ 2024-03-31 34/week @ 2024-04-07 96/week @ 2024-04-14 42/week @ 2024-04-21 3/week @ 2024-04-28 2/week @ 2024-05-05 43/week @ 2024-05-12 75/week @ 2024-05-19 30/week @ 2024-05-26 37/week @ 2024-06-02 45/week @ 2024-06-09 65/week @ 2024-06-16 48/week @ 2024-06-23 62/week @ 2024-06-30 2/week @ 2024-07-07 14/week @ 2024-07-14

每月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