【问题标题】:How to test async functions that use Tokio?如何测试使用 Tokio 的异步函数?
【发布时间】:2022-04-07 09:36:41
【问题描述】:

我有一个需要测试的异步函数。该函数使用mongodb::Database对象运行,所以我在setup()函数中初始化连接,并使用tokio_test::block_on()await表达式包裹在里面。

#[cfg(test)]
mod tests {
    use mongodb::{options::ClientOptions, Client};
    use tokio_test;

    async fn setup() -> mongodb::Database {
        tokio_test::block_on(async {
            let client_uri = "mongodb://127.0.0.1:27017";
            let options = ClientOptions::parse(&client_uri).await;
            let client_result = Client::with_options(options.unwrap());
            let client = client_result.unwrap();
            client.database("my_database")
        })
    }

    #[test]
    fn test_something_async() {
        // for some reason, test cannot be async
        let DB = setup(); // <- the DB is impl std::future::Future type

        // the DB variable will be used to run another
        // async function named "some_async_func"
        // but it doesn't work since DB is a Future type
        // Future type need await keyword
        // but if I use await-async keywords here, it complains
        // error: async functions cannot be used for tests
        // so what to do here ?
        some_async_func(DB);
    }
}

【问题讨论】:

  • 使用 #[tokio::test] 而不是 #[test] 进行异步测试。
  • 它解决了我的问题。只需添加#[tokio::test],我的测试功能突然可以接受await。如果你使用actix-web,你可以将actix_rt添加到Cargo.toml和#[actix_rt::test]在测试函数之前

标签: rust rust-tokio


【解决方案1】:

只需在任何测试功能之前将#[test] 替换为#[tokio::test]。如果你使用actix-web,你可以在测试函数之前添加actix_rt到Cargo.toml#[actix_rt::test]

#[tokio::test]
async fn test_something_async() {
    let DB = setup(); // <- the DB is impl std::future::Future type

    // the DB variable will be used to run another
    // async function named "some_async_func"
    // but it doesn't work since DB is a Future type 
    // Future type need await keyword
    // but if I use await-async keywords here, it complains
    // error: async functions cannot be used for tests
    // so what to do here ?
    some_async_func(DB);
}

【讨论】:

  • 如果我在函数名中省略了asyncerror: the async keyword is missing from the function declaration
  • @rustyMagnet 只需将async 放在fn 之前,即async fn test_something_async()
  • 谢谢,这正是我所需要的!
猜你喜欢
  • 2021-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多