当前位置: 首页 > 知识库问答 >
问题:

带有异步函数#[tokio-test]的Rust doc测试

陆飞鸿
2023-03-14

现在,我必须编写一个异步main函数,用#[tokio-main]标记它,并在其中调用test_fn().await,以便在货物测试--doc期间运行一些异步函数。

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

共有1个答案

微生景胜
2023-03-14

Doc测试自动将代码块包装在同步的fn main(){…}中。.awaiting需要异步运行库。您不能.await而不产生某种运行时。您可以为每个doc测试生成一个常规的多线程运行时:

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

为每个doc测试生成一个运行时可能不是最好的主意。更好的方法是使用tokio_test::block_on,它使用测试本地运行时(类似于#[tokio-test])阻止提供的未来:

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

为了减少样板,您可以为block_on创建一个宏:

macro_rules! bo {
  ($e:expr) => {
    tokio_test::block_on($e)
  };
}
/// ```rust
/// let len = async { "aaaa".len() };
/// assert_eq!(bo!(len), 4)
/// ```
 类似资料:
  • 我有以下问题:我试图从函数调用闭包,但是以后必须调用另一个函数。 我无法创建异步闭包,因为它们目前不稳定: 所以我得以某种方式这样做。 我发现了几个与该问题相关的问题,例如,但是当我试图实现它时,我收到了以下错误: 这里是游乐场链接,希望能显示我有什么问题。 我正在使用标题中所述的tokio。

  • 在我的React项目中,我正在单元测试一个调用另一个异步函数的异步函数。 尽管每次测试时,结果都是一个空的promise{},而不是预期的数据。我在网上找到了很多模拟异步“getJobStatuses”函数结果的实现,但都没有成功(显示了我在这里使用的实现)。为了测试调用它的函数(getAllJobs),模拟该函数结果的正确方法是什么

  • 我在一个函数中有这样的代码块: 它获取一些数据,然后对数据运行验证()。 但是,我对数据的验证实际上也是异步的,因为它是根据一个json模式来验证数据的,而json模式位于一个独立的json文件中,所以它必须首先读取该文件。 我使用了一个承诺来读取文件内容,然后进行验证: 如何编辑此问题中的顶部代码块以解释if语句()中的异步函数?

  • 粗略地说,异步函数 为使用 Promise 的代码提供了更好的语法。 38.1. 异步函数:基础知识 考虑以下异步函数: async function fetchJsonAsync(url) { try { const request = await fetch(url); // async const text = await request.text(); // as

  • JUnit提供了跟踪代码异常处理的选项。 您可以测试代码是否抛出所需的异常。 expected参数与@Test注释一起使用。 让我们看看@Test(预期)在行动。 创建一个类 (Create a Class) 在C:\“JUNIT_WORKSPACE中创建一个要测试的java类,比如MessageUtil.java 。 在printMessage()方法中添加错误条件。 /* * This cla

  • TestNG提供了跟踪代码异常处理的选项。 您可以测试代码是否抛出所需的异常。 这里的expectedExceptions参数与@Test注释一起使用。 现在,让我们看看@Test(expectedExceptions)的实际应用。 创建一个类 (Create a Class) 在C:\》 TestNG_WORKSPACE创建一个要测试的java类,比如MessageUtil.java 。 在pr