克隆请求响应
Clone reqwest response
我目前正在尝试使用 actix-web 和 reqwest 测试 API 端点。
我可以插入一些记录(使用 sqlx),然后发出请求并检查它返回 200 HTTP 状态,并证实返回的数据属于创建的用户 - 端点返回了预期的内容。但是,这样做是“依赖于顺序”的,否则我会收到以下错误:
borrow of moved value: response
value borrowed here after move rustc(E0382)
这是导致错误的原因:
let inserted_user = sqlx::query!(
r#"
INSERT INTO users (name)
VALUES ()
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());
如果我将 response.status()
上的断言顺序与 assert_eq!
上的断言顺序交换,它就可以工作。但我认为这不是最好的方式,因为它应该明确说明,并附上评论或进一步了解以这种特定方式工作。
如果我无法克隆 reqwest 响应,是否可以避免依赖断言的顺序?或者我如何克隆它?
老实说,我认为在您收到回复后,断言会更有意义。您为什么要解析响应,并且仅 then 断言响应甚至正常?如果一开始响应不正确,那么解析很可能无论如何都会失败,您甚至无法得出断言,不是吗?
但是如果你真的想在那个时候做断言,你可以在使用响应之前将 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());
我目前正在尝试使用 actix-web 和 reqwest 测试 API 端点。
我可以插入一些记录(使用 sqlx),然后发出请求并检查它返回 200 HTTP 状态,并证实返回的数据属于创建的用户 - 端点返回了预期的内容。但是,这样做是“依赖于顺序”的,否则我会收到以下错误:
borrow of moved value:
response
value borrowed here after move rustc(E0382)
这是导致错误的原因:
let inserted_user = sqlx::query!(
r#"
INSERT INTO users (name)
VALUES ()
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());
如果我将 response.status()
上的断言顺序与 assert_eq!
上的断言顺序交换,它就可以工作。但我认为这不是最好的方式,因为它应该明确说明,并附上评论或进一步了解以这种特定方式工作。
如果我无法克隆 reqwest 响应,是否可以避免依赖断言的顺序?或者我如何克隆它?
老实说,我认为在您收到回复后,断言会更有意义。您为什么要解析响应,并且仅 then 断言响应甚至正常?如果一开始响应不正确,那么解析很可能无论如何都会失败,您甚至无法得出断言,不是吗?
但是如果你真的想在那个时候做断言,你可以在使用响应之前将 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());