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
每月下载量 351,260
用于 373 个 Crates (370 个直接使用)
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
失败,将显示上次不匹配请求的彩色差异
使用 匹配器 以不同的方式处理对相同端点的请求
#[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
贡献指南
- 检查现有问题和拉取请求。
- 一个提交是一个特性 - 考虑压缩。
- 使用
cargo fmt
格式化代码。 - :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