Axum 的测试模型非常干净。
因为 Router 本质上就是一个 Service,所以你可以直接构造请求,把它喂进去。
use axum::{
body::Body,
http::{Request, StatusCode},
};
use tower::ServiceExt;
#[tokio::test]
async fn create_permit_works() {
let app = build_app();
let response = app
.oneshot(
Request::builder()
.method("POST")
.uri("/permits")
.header("content-type", "application/json")
.body(Body::from(r#"{"owner":"Ada","zone":"A-01"}"#))
.unwrap(),
)
.await
.unwrap();
assert_eq!(response.status(), StatusCode::CREATED);
}这张图非常直观:
构造一辆测试货车
│
▼
直接开进 Router
│
▼
拿到响应回执
│
▼
断言状态码 / body / header所以 Axum 的测试体验比很多人想象得轻:
- 不一定要真的起端口
- 不一定要跑外部服务器
- 直接拿 Router 做内存内演练就行