#[actix_rt::test] asyncfntest_create_todos() { let todo_title = "Create todo List";
let params = CreateTodoList { title: todo_title.into(), }; let response = assert_post("/todos", params).await; // 检查放返回数据 let body = test::read_body(response).await; let try_created: Result<models::TodoList, serde_json::error::Error> = serde_json::from_slice(&body); assert!(try_created.is_ok(), "Response couldn't not be parsed"); // 使用接口查看数据 let created_list = try_created.unwrap(); let resp = assert_get("/todos").await; let todos: Vec<models::TodoList> = test::read_body_json(resp).await; let maybe_list = todos.iter().find(|todo| todo.id == created_list.id); assert!(maybe_list.is_some(), "Item not found!"); }
running 2 tests test tests::handlers::test_hello_world ... ok test tests::handlers::test_create_todos ... ok
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
测试 GET 接口
最后添加 GET 集成测试:
use crate::db::create_todo; use crate::tests::helpers::{assert_get, assert_post, APP_STATE}; use deadpool_postgres::Client; // ...
#[actix_rt::test] asyncfntest_get_todos() { // create data in db let todo_title = "New Todo List"; let client: Client = APP_STATE .pool .get() .await .expect("Error connecting to the database"); let new_todo = create_todo(&client, todo_title.into()).await; assert!(new_todo.is_ok(), "Failed to create new test todo"); // get and check let new_todo = new_todo.unwrap(); let response = assert_get("/todos").await; let todos: Vec<models::TodoList> = test::read_body_json(response).await; let maybe_list = todos.iter().find(|todo| todo.id == new_todo.id); assert!(maybe_list.is_some(), "Item not found!"); }
运行结果:
$ cargo test
running 3 tests test tests::handlers::test_hello_world ... ok test tests::handlers::test_get_todos ... ok test tests::handlers::test_create_todos ... ok
test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out