您如何测试将在Tokio运行时中运行的期货?
fn fut_dns() -> impl Future<Item = (), Error = ()> {
let f = dns::lookup("www.google.de", "127.0.0.1:53");
f.then(|result| match result {
Ok(smtptls) => {
println!("{:?}", smtptls);
assert_eq!(smtptls.version, "TLSRPTv1");
assert!(smtptls.rua.len() > 0);
assert_eq!(smtptls.rua[0], "mailto://...");
ok(())
}
Err(e) => {
println!("error: {:?}", e);
err(())
}
})
}
#[test]
fn smtp_log_test() {
tokio::run(fut_dns());
assert!(true);
}
assert
上的未来运行和未来恐慌的根源。您可以在控制台中阅读紧急消息,但是test
无法识别tokio::run
的线程。
How can I test a future that is bound to a tokio TcpStream?并没有回答,因为它只是说:测试异步代码的一种简单方法可能是为每个测试使用专用的运行时
我这样做!
我的问题与测试如何检测未来是否可行有关。未来需要一个启动的运行时环境。
尽管将来会声明或调用err(),但测试成功。
那我该怎么办?
答案 0 :(得分:2)
不要在将来写断言。
如How can I test a future that is bound to a tokio TcpStream?中所述,创建一个Runtime
以执行您的未来。如How do I synchronously return a value calculated in an asynchronous Future in stable Rust?中所述,计算您的值,然后退出异步世界:
fn run_one<F>(f: F) -> Result<F::Item, F::Error>
where
F: IntoFuture,
F::Future: Send + 'static,
F::Item: Send + 'static,
F::Error: Send + 'static,
{
let mut runtime = tokio::runtime::Runtime::new().expect("Unable to create a runtime");
runtime.block_on(f.into_future())
}
#[test]
fn smtp_log_test() {
let smtptls = run_one(dns::lookup("www.google.de", "127.0.0.1:53")).unwrap();
assert_eq!(smtptls.version, "TLSRPTv1");
assert!(smtptls.rua.len() > 0);
assert_eq!(smtptls.rua[0], "mailto://...");
}