0

我目前正在尝试使用 actix-web 和 reqwest 测试 API 端点。

我可以插入一些记录(使用 sqlx),然后发出请求并检查它是否返回了 200 HTTP 状态,并证实返回的数据属于创建的用户 - 端点返回了预期的内容。但是,这样做是“订单依赖”,否则我会收到以下错误:

移动值response
借用:移动 rustc(E0382) 后在此处借用的值

这就是给出错误的原因:

let inserted_user = sqlx::query!(
    r#"
    INSERT INTO users (name)
    VALUES ($1)
    RETURNING id
    "#,
    String::from("john"),
)
.fetch_one(&app.db_pool)
.await
.unwrap();

let response = client
    .get(&format!("{}/", &app.address))
    .send()
    .await?;

let users: Vec<User> = response.json().await?;
assert_eq!(inserted_user.id, users[0].id);
assert!(response.status().is_success());

如果我交换断言的顺序 on response.status()assert_eq!它就可以工作。但我认为这不是最好的方式,正如应该明确说明的那样,有评论或进一步了解这以这种特定方式工作。

如果我无法克隆 reqwest 响应,是否可以避免依赖断言的顺序?或者我怎么能克隆它?

4

1 回答 1

2

老实说,我认为在你得到回应之后,这个断言就更有意义了。为什么您要解析响应,然后才断言响应甚至可以?如果一开始响应不正确,那么解析很可能无论如何都会失败,您甚至不会到达断言,不是吗?

但是如果你真的想在那个时候做断言,你可以response.status()在使用响应之前放入一个临时的:

let status = respons.status();
let users: Vec<User> = response.json().await?;
assert_eq!(inserted_user.id, users[0].id);
assert!(status.is_success());
于 2021-07-12T08:07:08.470 回答