您如何在tokio :: run futures内编写测试断言?

时间:2018-10-30 16:12:14

标签: rust rust-tokio

您如何测试将在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(),但测试成功。

那我该怎么办?

1 个答案:

答案 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://...");
}