为了确保测试能够在随机可用的端口上运行,我们需要对 zero2prod::run
函数进行一些修改,使其接受一个端口号作为参数。如果端口号未指定,可以选择一个随机可用的端口。这样可以避免端口冲突问题,确保测试的稳定性和并行性。
当然!我们可以使用 std::net::TcpListener
来绑定一个随机可用的端口,然后将这个 TcpListener
传递给 HttpServer
,从而实现更灵活的端口管理。以下是优化后的代码
rust">///! src/lib.rsuse std::net::TcpListener;use actix_web::dev::Server;
use actix_web::{web, App, HttpResponse, HttpServer, Responder};async fn health_check() -> impl Responder {HttpResponse::Ok().finish()
}pub fn run(listener: TcpListener) -> std::io::Result<Server> {let server = HttpServer::new(|| App::new().route("/health_check", web::get().to(health_check))).listen(listener)?.run();Ok(server)
}
run函数里面传入TcpListener,里面使用listen监听
rust">/// ! tests/health_check.rs
use std::net::TcpListener;#[tokio::test]
async fn health_check_works() {let address = spawn_app();let client = reqwest::Client::new();let response = client.get(&format!("{}/health_check", &address)).send().await.expect("Failed to execute request.");assert!(response.status().is_success());assert_eq!(Some(0), response.content_length());
}fn spawn_app() -> String {let listener = TcpListener::bind("127.0.0.1:0").expect("Failed to bind random port");let port = listener.local_addr().unwrap().port();let server = zero2prod::run(listener).expect("Failed to bind address");let _ = tokio::spawn(server);format!("http://127.0.0.1:{}", port)
}
运行测试,OK,spawn_app 函数不需要使用异步调用,因此, async 关键字应该去掉,接下来即将开始学习开发邮件接收的第一个迭代了,先休息一下吧