【发布时间】:2022-02-08 00:00:45
【问题描述】:
我正在尝试使用Diesel 和Rocket 开发一个网络应用程序,方法是关注rocket guide。我不明白如何测试这个应用程序。
//in main.rs
#[database("my_db")]
struct PgDbConn(diesel::PgConnection);
#[post("/users", format="application/json", data="<user_info>")]
fn create_new_user(conn: PgDbConn, user_info: Json<NewUser>) {
use schema::users;
diesel::insert_into(users::table).values(&*user_info).execute(&*conn).unwrap();
}
fn main() {
rocket::ignite()
.attach(PgDbConn::fairing())
.mount("/", routes![create_new_user])
.launch();
}
// in test.rs
use crate::PgDbConn;
#[test]
fn test_user_creation() {
let rocket = rocket::ignite().attach(PgDbConn::fairing());
let client = Client::new(rocket).unwrap();
let response = client
.post("/users")
.header(ContentType::JSON)
.body(r#"{"username": "xyz", "email": "temp@abc.com"}"#)
.dispatch();
assert_eq!(response.status(), Status::Ok);
}
但这会修改数据库。如何确保测试不会改变数据库。
我尝试创建两个数据库并按以下方式使用它们(我不确定是否推荐)
#[cfg(test)]
#[database("test_db")]
struct PgDbConn(diesel::PgConnection);
#[cfg(not(test))]
#[database("live_db")]
struct PgDbConn(diesel::PgConnection);
现在我想我可以通过以下方式使用diesel::connection::Connection trait 的test_transaction 方法:-
use crate::PgDbConn;
#[test]
fn test_user_creation() {
// !!This statment is wrong as PgDbConn is an Fn object instead of a struct
// !!I am not sure how it works but it seems that this Fn object is resolved
// !!into struct only when used as a Request Guard
let conn = PgDbConn;
// Deref trait for PgDbConn is implemented, So I thought that dereferencing
// it will return a diesel::PgConnection
(*conn).test_transaction::<_, (), _>(|| {
let rocket = rocket::ignite().attach(PgDbConn::fairing());
let client = Client::new(rocket).unwrap();
let response = client
.post("/users")
.header(ContentType::JSON)
.body(r#"{"username": "Tushar", "email": "temp@abc.com"}"#)
.dispatch();
assert_eq!(response.status(), Status::Ok);
Ok(())
});
}
上面的代码显然无法编译。有没有办法将此Fn 对象解析为结构并在其中获取PgConnection。而且我什至不确定这是否是正确的做事方式。
在同时使用Rocket 和Diesel 时是否有推荐的测试方法?
【问题讨论】:
标签: rust rust-diesel rust-rocket