wiremock-rs:Rust 的 HTTP Mock 服务器
\n\n在现代软件开发中,测试是流程中不可或缺的一部分。测试与外部 HTTP 服务交互的代码尤其困难。此时,wiremock-rs 库便派上了用场——它是 Rust 生态系统中用于创建 HTTP mock 服务器的强大工具。
\n\nwiremock-rs 提供了模拟外部 HTTP 服务行为的能力,使开发者能够在隔离环境中测试代码。无需向外部 API 发送真实请求(这可能缓慢、不可靠或成本高昂),您可以创建一个本地 mock 服务器,它将完全按照您的设定进行响应。这在编写集成测试、测试错误处理以及开发客户端库时尤其有用。
\n\n该库受流行的 Java 工具 WireMock 启发,但完全用 Rust 重写,并考虑了该语言的惯用用法和特性。wiremock-rs 支持所有主要功能:按 URL、标头、请求体进行匹配;返回不同的 HTTP 状态码;响应延迟;调用次数验证等等。
\n\n安装
\n\n要安装 wiremock-rs,请将依赖项添加到您的 Cargo.toml 文件中:
[dev-dependencies]\nwiremock = "0.6"\n\n然后执行命令:
\n\ncargo build\n\n同时确保您已安装 Rust 和 Cargo。如果尚未安装,请通过 rustup 进行安装。
快速入门
\n\n让我们创建一个最简单的 mock 服务器,用于响应 GET 请求:
\n\nuse wiremock::{MockServer, Mock, ResponseTemplate};\nuse wiremock::matchers::{method, path};\n\n#[tokio::main]\nasync fn main() {\n // 在随机端口上启动 mock 服务器\n let mock_server = MockServer::start().await;\n \n // 创建规则:对 GET /hello 响应状态码 200 和正文 "Hello, World!"\n let mock = Mock::given(method("GET"))\n .and(path("/hello"))\n .respond_with(ResponseTemplate::new(200)\n .set_body_string("Hello, World!"));\n \n // 在服务器上注册规则\n mock_server.register(mock).await;\n \n // 现在可以向服务器发送请求了\n let client = reqwest::Client::new();\n let response = client.get(&format!("{}/hello", &mock_server.uri()))\n .send()\n .await\n .unwrap();\n \n println!("状态码: {}", response.status());\n println!("正文: {}", response.text().await.unwrap());\n \n // 停止服务器(main 函数结束时自动发生)\n}\n\n这个最小示例展示了核心思想:启动服务器,定义规则(匹配器)和响应(响应模板),然后注册它们。之后,您的客户端代码就可以向 mock 服务器发送请求了。
\n\n主要方法和函数
\n\n1. MockServer::start()
\n签名: pub async fn start() -> MockServer
描述: 在随机可用端口上启动一个新的 mock 服务器。服务器将一直运行,直到 MockServer 对象被销毁。
\nlet server = MockServer::start().await;\nprintln!("服务器已启动,地址为 {}", server.uri());\n\n2. MockServer::start_on_port(port: u16)
\n签名: pub async fn start_on_port(port: u16) -> MockServer
描述: 在指定端口上启动 mock 服务器。当需要固定端口进行配置时很有用。
\nlet server = MockServer::start_on_port(8080).await;\nassert_eq!(server.uri(), "http://127.0.0.1:8080");\n\n3. Mock::given(matcher: impl Matcher)
\n