1

您如何测试打算在 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.

如何测试绑定到 tokio TcpStream 的未来?没有回答这个问题,因为它只是说:测试异步代码的简单方法可能是为每个测试使用专用运行时

我这样做!

我的问题与测试如何检测未来是否有效有关。未来需要一个启动的运行时环境。

尽管 future 断言或调用 err(),但测试成功。

那么我能做什么呢?

4

1 回答 1

2

不要在未来写下你的断言。

如何测试绑定到 tokio TcpStream 的未来中所述?,创造一个Runtime执行你的未来。如如何在稳定的 Rust 中同步返回在异步 Future 中计算的值?,计算你的值,然后退出异步世界:

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://...");
}
于 2018-10-30T17:00:54.383 回答