【发布时间】:2021-11-05 04:37:37
【问题描述】:
我正在为我的 Rust http 服务器处理程序编写一些单元测试。但是当我运行其中一项测试时,它会卡在内部函数的末尾。这是代码的相关部分:
async fn generate(request: Request<Body>) -> Result<Response<Body>, hyper::Error> {
let result = process_request(request).await;
println!("This message doesn't get printed!!");
let (spec, override) = match result {
Ok((s, o)) => (s, o),
Err(process_error) => {
return Ok(Response::new(Body::from(format!("{}", process_error))));
},
};
...
Ok(Response::new(Body::from(format!("{}", response))))
}
async fn process_request(request: Request<Body>) -> Result<(Spec, Option<Config>), Error> {
let body = body::to_bytes(request.into_body()).await;
let payload: Payload = serde_json::from_slice(&body.unwrap().to_vec()).unwrap();
let spec_str = payload.spec.to_owned();
...
println!("Function runs to this point and prints this message");
Ok((spec, override))
}
#[tokio::test]
async fn test_gen() {
let payload = Payload {
spec: a_spec(),
};
let payload_json = serde_json::to_string_pretty(&payload).unwrap();
let request = Request::builder().body(Body::from(payload_json));
let result = generate(request.unwrap()).await.unwrap();
// Some asserts ...
}
我想知道我做错了什么?
【问题讨论】:
-
我们怎么知道?
-
作用域内的值在函数末尾被删除,因此可能存在阻塞的
Drop实现。但这只是猜测,请提供minimal reproducible example。 -
请不要编辑您的问题以提供解决方案。您可以在下面回答您自己的问题。但此外,您应该更新您的问题以使其可重现(我猜即使为线程调用添加一个存根就足够了)。这样一来,问题和答案将对未来的观众最有帮助。
-
@kmdreko:我在现有代码周围放置了一个 http 包装器。只是分享经验。
标签: unit-testing rust hyper