全书目录

第三十九篇:Axum 完全指南 —— Rust 类型关口宇宙

第十七章:测试 —— 不开真关口,也能做通关演练

1 分钟 133 字 第 763 / 962 个阅读单元

Axum 的测试模型非常干净。

因为 Router 本质上就是一个 Service,所以你可以直接构造请求,把它喂进去。

rust
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);
}

这张图非常直观:

text
构造一辆测试货车
        │
        ▼
直接开进 Router
        │
        ▼
拿到响应回执
        │
        ▼
断言状态码 / body / header

所以 Axum 的测试体验比很多人想象得轻:

  • 不一定要真的起端口
  • 不一定要跑外部服务器
  • 直接拿 Router 做内存内演练就行