Как вы пишете тестовые утверждения внутри фьючерсов tokio :: run? - PullRequest
0 голосов
/ 30 октября 2018

Как вы тестируете свои фьючерсы, которые должны быть запущены во время выполнения 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? не отвечает на это, потому что просто говорит: Простой способ проверить асинхронный код может состоять в использовании выделенное время выполнения для каждого теста

Я делаю это!

Мой вопрос связан с тем, как тест может определить, работает ли будущее. Будущее нуждается в запущенной среде исполнения.

Тест пройден успешно, хотя будущее утверждает или вызывает err ().

Так что я могу сделать?

1 Ответ

0 голосов
/ 30 октября 2018

Не пишите свои утверждения в будущем.

Как описано в Как я могу проверить будущее, связанное с Tokio TcpStream? , создайте Runtime для исполнения своего будущего. Как описано в Как мне синхронно вернуть значение, рассчитанное в асинхронном будущем в стабильном 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://...");
}
...