70 个版本 (10 个稳定版)

1.5.0 2024年7月31日
1.4.0 2024年2月28日
1.2.0 2023年9月15日
1.1.0 2023年6月17日
0.1.4 2016年1月11日

网页开发 中排名 #6

Download history 37707/week @ 2024-05-03 37876/week @ 2024-05-10 38140/week @ 2024-05-17 35908/week @ 2024-05-24 38958/week @ 2024-05-31 39636/week @ 2024-06-07 41335/week @ 2024-06-14 43964/week @ 2024-06-21 35560/week @ 2024-06-28 39758/week @ 2024-07-05 43096/week @ 2024-07-12 78230/week @ 2024-07-19 73437/week @ 2024-07-26 87741/week @ 2024-08-02 93570/week @ 2024-08-09 83225/week @ 2024-08-16

每月下载量 351,260
用于 373 个 Crates (370 个直接使用)

MIT 许可证

95KB
1.5K SLoC

Rust 的 HTTP 模拟!

Mockito 是一个用于在 Rust 中 生成和交付 HTTP 模拟 的库。您可以使用它进行集成测试或离线工作。Mockito 运行一个本地的 HTTP 服务器池,该池创建、交付和删除模拟。

特性

  • 支持 HTTP1/2
  • 并行运行测试
  • 提供广泛的请求匹配器(正则表达式、JSON、查询参数等)
  • 检查模拟是否被调用(间谍模式)
  • 同时模拟多个主机
  • 提供同步和异步接口
  • 在出现错误时打印出上次不匹配请求的彩色差异
  • 简单直观的 API
  • 一个很酷的标志

完整文档可在 https://docs.rs/mockito 查找。

在升级之前,请查看 变更日志

入门指南

mockito 添加到您的 Cargo.toml 并开始模拟

#[test]
fn test_something() {
    // Request a new server from the pool
    let mut server = mockito::Server::new();

    // Use one of these addresses to configure your client
    let host = server.host_with_port();
    let url = server.url();

    // Create a mock
    let mock = server.mock("GET", "/hello")
      .with_status(201)
      .with_header("content-type", "text/plain")
      .with_header("x-api-key", "1234")
      .with_body("world")
      .create();

    // Any calls to GET /hello beyond this line will respond with 201, the
    // `content-type: text/plain` header and the body "world".

    // You can use `Mock::assert` to verify that your mock was called
    mock.assert();
}

如果 Mock::assert 失败,将显示上次不匹配请求的彩色差异

colored-diff.png

使用 匹配器 以不同的方式处理对相同端点的请求

#[test]
fn test_something() {
    let mut server = mockito::Server::new();

    server.mock("GET", "/greetings")
      .match_header("content-type", "application/json")
      .match_body(mockito::Matcher::PartialJsonString(
          "{\"greeting\": \"hello\"}".to_string(),
      ))
      .with_body("hello json")
      .create();

    server.mock("GET", "/greetings")
      .match_header("content-type", "application/text")
      .match_body(mockito::Matcher::Regex("greeting=hello".to_string()))
      .with_body("hello text")
      .create();
}

启动 多个服务器 来模拟对不同主机的请求

#[test]
fn test_something() {
    let mut twitter = mockito::Server::new();
    let mut github = mockito::Server::new();

    // These mocks will be available at `twitter.url()`
    let twitter_mock = twitter.mock("GET", "/api").create();

    // These mocks will be available at `github.url()`
    let github_mock = github.mock("GET", "/api").create();
}

编写 异步 测试(确保使用 _async 方法!)

#[tokio::test]
async fn test_simple_route_mock_async() {
    let mut server = Server::new_async().await;
    let m1 = server.mock("GET", "/a").with_body("aaa").create_async().await;
    let m2 = server.mock("GET", "/b").with_body("bbb").create_async().await;

    let (m1, m2) = futures::join!(m1, m2);

    // You can use `Mock::assert_async` to verify that your mock was called
    // m1.assert_async().await;
    // m2.assert_async().await;
}

在专用端口上启动一个 独立服务器

fn main() {
    let opts = mockito::ServerOpts {
        host: "0.0.0.0",
        port: 1234,
        ..Default::default()
    };
    let mut server = mockito::Server::new_with_opts(opts);

    let _m = server.mock("GET", "/").with_body("hello world").create();

    loop {}
}

最低支持的 Rust 工具链

当前最低支持的 Rust 工具链是 1.70.0

贡献指南

  1. 检查现有问题和拉取请求。
  2. 一个提交是一个特性 - 考虑压缩。
  3. 使用 cargo fmt 格式化代码。
  4. :shipit

开发

测试

运行测试

cargo test

...或者使用不同的工具链运行测试

rustup run --install 1.70.0 cargo test

...或者在禁用默认功能(例如颜色)的情况下运行测试

cargo test --no-default-features

代码风格

Mockito 使用 rustfmt 作为通用代码风格。

安装 rustfmt

rustup component add rustfmt

格式化代码

cargo fmt

一些编辑器可能提供插件来自动格式化您的 Rust 代码。

代码检查器

Mockito 使用 clippy,并且应该在最低支持的 Rust 版本上始终运行,以确保向后兼容性。

安装 clippy

rustup component add clippy

代码检查器始终在最低支持的 Rust 版本上运行

rustup run --install 1.70.0 cargo clippy-mockito

发布

发布

cargo publish

基准测试

安装 rust nightly

rustup install nightly

运行基准测试

rustup run nightly cargo bench

依赖关系

~8–18MB
~229K SLoC