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

Fuy*_*Liu 7 rust rust-cargo rust-tokio

似乎无法#[tokio-test]在 Rust 文档测试中用于测试异步函数?

现在,我必须编写一个异步主函数,并用它来标记它#[tokio-main]并调用test_fn().await它,以让一些异步函数在cargo test --doc.

是否还有其他更好的方法来允许文档测试像普通测试功能一样运行,例如使用#[tokio-test]?另外,如果标签#[tokio-test]可以在文档中显示,那就太好了,这样用户就可以复制文档并直接在项目中将其用作测试。(这可能可以像这样完成##[tokio-test]?)

Ibr*_*med 9

文档测试自动将代码块包装在同步 fn main() { ... }. .awaiting 需要异步运行时。.await如果不产生某种运行时,你就无法做到这一点。您可以为每个文档测试生成常规的多线程运行时:

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

..但这可能不是最好的主意。更好的方法是使用tokio_test::block_on测试本地运行时(类似于#[tokio::test])来阻止所提供的未来:

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


Ras*_*111 5

如果您想在 doctest 中使用异步代码而不为每个代码生成新的运行时,您可以将整个 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)
/// # })
/// ```
Run Code Online (Sandbox Code Playgroud)