使用异步函数进行Rust doc测试#[tokio-test]

i2loujxw  于 2022-11-24  发布在  其他
关注(0)|答案(3)|浏览(323)

在Rust doc测试中,似乎不能使用#[tokio-test]来测试异步函数?
现在,我必须编写一个async主函数,用#[tokio-main]标记它,并在其中调用test_fn().await,以使一些async函数在cargo test --doc期间运行。
有没有其他更好的方法可以让doc测试像普通测试函数一样运行,例如使用#[tokio-test]?而且,如果标记#[tokio-test]可以显示在doc中,那么用户可以复制doc并将其直接用作他们项目中的测试,这将是很好的。(这可能可以像##[tokio-test]一样完成?)

wxclj1h5

wxclj1h51#

文档测试自动将代码块 Package 在一个 synchronousfn main() { … }中。.await需要一个 asynchronous 运行时。如果不产生某种运行时,您就不能.await。您 * 可以 * 为每个文档测试产生一个常规的多线程运行时:

/// ```rust
/// #[tokio::main]
/// async fn main() {
///    let len = async { "aaaa".len() }.await;
///    assert_eq!(len, 4);
/// }
/// ```

..但这可能不是最好的办法。一个更好的方法是使用tokio_test::block_on,它使用一个测试本地运行时(类似于#[tokio::test])来阻塞所提供的future:

/// ```rust
/// # tokio_test::block_on(async {
/// let len = async { "aaaa".len() }.await;
/// assert_eq!(len, 4);
/// # }
/// ```
taor4pac

taor4pac2#

如果你想在doctest中使用异步代码,而不为每一个都产生一个新的运行时,你可以只 Package 整个doctest,而不仅仅是tokio_test::block_on中的异步部分。
示例:

/// Asynchronously get length of "aaaa"
/// ```
/// # tokio_test::block_on(async {
///   let len = async { "aaaa".len() };
///   assert_eq!(len.await, 4)
/// # })
/// ```
k10s72fa

k10s72fa3#

我对您的特殊用例了解不够,但您可能希望避免异步运行时,并将文档代码块 Package 为如下所示:

/// ...
/// Example
/// ```rust,no_run // <- try using this `no_run` tag
/// ...
/// #[tokio::main]
/// async fn main() {
/// ...
/// }
/// ...
/// ```

相关问题