带异步功能的Rust doc测试#[东京测试]

带异步功能的Rust doc测试#[东京测试],rust,rust-cargo,rust-tokio,Rust,Rust Cargo,Rust Tokio,在Rust doc测试中,似乎不能使用#[tokio test]来测试异步函数 现在,我必须编写一个异步主函数,并用#[tokio main]标记它,然后调用test\u fn()。等待它中的,让一些异步函数在货物测试--doc期间运行 是否有其他更好的方法允许doc测试像正常测试功能一样运行,例如使用#[tokio test]?另外,如果标签#[tokio test]可以显示在文档中,那么用户可以复制文档,并将其直接用作项目中的测试。(这可能可以像##[tokio test]?)那样完成)文档

在Rust doc测试中,似乎不能使用
#[tokio test]
来测试异步函数

现在,我必须编写一个异步主函数,并用
#[tokio main]
标记它,然后调用
test\u fn()。等待它中的
,让一些异步函数在
货物测试--doc
期间运行


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

文档测试自动将代码块包装在同步
fn main(){…}
中<代码>。等待
需要异步运行时。如果不生成某种运行时,就不能
.wait
。您可以为每个文档测试生成一个常规的多线程运行时:

/``生锈
///#[tokio::main]
///异步fn main(){
///让len=async{“aaaa”.len()}.await;
///断言(len,4);
/// }
/// ```
为每个文档测试生成一个运行时可能不是最好的主意。更好的方法是使用测试本地运行时(类似于
#[tokio test])
来阻止提供的未来:

/``生锈
///设len=tokio_test::block_on(async{“aaaa”.len()});
///断言!(len,4);
/// ```
要简化样板,您可以在
上为
块\u创建宏:

macro\u规则!博{
($e:expr)=>{
tokio_测试:$e上的块_
};
}
并像这样使用它:

/``生锈
///设len=async{“aaaa”.len()};
///断言!(博!(伦),4)
/// ```

如果您想在doctest中使用异步代码而不为每个doctest生成新的运行时,您可以只包装整个doctest,而不只是将异步部分包装在文档中

例如:

///异步获取“aaaa”的长度
/// ```
///#tokio_测试::块_开启(异步{
///设len=async{“aaaa”.len()};
///断言(len.await,4)
/// # })
/// ```

谢谢。我遇到的问题是,我想使用doc演示如何使用
#[tokio test]
编写异步代码测试。但是如果
#[tokio test]
不能与doc一起使用,那么我可能无法编写一个能够演示如何使用
#[tokio test]
并在货物测试期间运行文档代码的文档。谢谢。这似乎是一个很好的解决方案。请注意,在当前(0.4.2)版本的
tokio_test::block_on()
,这将创建一个新的运行时,因此它大致相当于
#tokio::runtime::Handle::new().unwrap()。block_on(异步{
这与我的答案有什么不同?