【问题标题】:Testing with Rocket and Diesel使用火箭和柴油进行测试
【发布时间】:2022-02-08 00:00:45
【问题描述】:

我正在尝试使用DieselRocket 开发一个网络应用程序,方法是关注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。而且我什至不确定这是否是正确的做事方式。

在同时使用RocketDiesel 时是否有推荐的测试方法?

【问题讨论】:

    标签: rust rust-diesel rust-rocket


    【解决方案1】:

    这根本不会像你想象的那样工作,因为conn 将是一个不同于火箭为你生成的连接。 test_transaction 模式假设您对所有内容都使用相同的连接。

    【讨论】:

    • 是的,多问了一会儿,我才知道路由处理程序会打开一个单独的连接,并将测试数据提交到数据库中;因此使用test_transaction 没有意义。那么有没有办法测试数据是否正确输入数据库并同时将数据库恢复到以前的状态?
    猜你喜欢
    • 2021-04-16
    • 2021-11-07
    • 2021-10-07
    • 2022-12-10
    • 2022-12-10
    • 2020-04-14
    • 2021-03-17
    • 2023-03-27
    • 2021-07-25
    相关资源
    最近更新 更多