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

测试不编译:“函数声明中缺少async关键字”

商风华
2023-03-14
#[cfg(test)]
mod tests {
    #[tokio::test]
    async fn test_format_str() {
        let src = "a";
        let expect = "a";
        assert_eq!(expect, src);
    }
}
error: the async keyword is missing from the function declaration
   --> src\domain\models\product.rs:185:11
    |
185 |     async fn test_format_str() {
    |           ^^

error: aborting due to previous error

这对我来说毫无意义,因为异步已经存在。

我最初的计划是这样的:

#[cfg(test)]
mod tests {
    #[test]
    fn test_format_str() {
        let src = "a";
        let expect = "a";
        assert_eq!(expect, src);
    }
}

因为所有测试都不是异步的,但这会产生相同的错误:

error: the async keyword is missing from the function declaration
   --> src\domain\models\product.rs:185:5
    |
185 |     fn test_format_str() {
    |     ^^

error: aborting due to previous error
#[macro_use]
extern crate tokio;

#[tokio::main]
async fn main() -> std::io::Result<()> {
    Ok(())
}

#[cfg(test)]
mod tests {
    #[test]
    async fn test_format_str() {
        let src = "a";
        let expect = "a";
        assert_eq!(expect, src);
    }
}
[dependencies]
tokio = { version = "0.2.22", features = ["full"]}

移除

#[macro_use]
extern crate tokio;

并将tokio宏用作tokio::ex。Tokio::try_join!解决了眼前的问题,尽管知道为什么会发生这种情况会很好。

共有1个答案

董胡非
2023-03-14

这是tokio_macros0.2.4和0.2.5版本中的一个bug。以下最小示例也无法生成:

use tokio::test;

#[test]
async fn it_works() {}

潜在的问题在于此测试宏扩展到的代码。在当前发布的版本中,大致如下:

#[test]
fn it_works() {
    tokio::runtime::Builder::new()
        .basic_scheduler()
        .enable_all()
        .build()
        .unwrap()
        .block_on(async { {} })
}

请注意#[test]属性。它旨在引用标准的test属性,即普通的测试函数标记,但是,由于Tokio::test在作用域内,因此将再次调用它--而且,由于新函数不是异步的,它会引发错误。

 类似资料:
  • 问题内容: 您使用关键字还是引发一些验证运行时异常?它给您带来什么好处,或者为什么您认为不值得使用呢? 问题答案: 如果条件为假,则声明将抛出运行时错误(AssertionError)。断言为您提供了一种简化的方式来记录,检查和强制执行代码的正确性标准。好处是用于定义和操纵这些正确性条件的语言级挂钩。如果您希望启用或禁用它们(存在一些关于是否是个好主意的争论),则可以从JVM命令行中启用。下面的一

  • 我正在为Junit编写测试,以测试我编写的删除函数: 此方法适用于同时具有前后节点的双链接列表。 问题是:我们的大学将针对我们编写的测试运行错误代码,以确定我们是否编写了足够的测试来捕获错误代码和异常。 我知道他们将运行的两个测试,但不知道错误的含义。 > 失败:缺少逻辑 故障:缺少NextNodeRepairLogic 这是我没有考虑的两个测试,因为我无法理解这些错误的含义。有人知道这些错误可能

  • 问题内容: 以下两个声明之间有什么区别? 和 是在堆栈上还是在堆上声明? 问题答案: 一个明显的区别是,一个全为零,另一个包含[1..5]。 但这是唯一的区别。两者都是5元素整数数组,都以相同的方式分配。用大括号声明不只是语法上的方便。 请注意,只有在声明数组时才能使用此形式: 但不是 要么 对象(数组是对象)在堆上分配。

  • 问题内容: 我正在通过Swift 2编写有关Swift的初学者教程。 它包含类似(随机示例)的代码 在Swift 3(我正在使用XCode 8 Beta)中,这已经发生了变化,并且IDE会帮助将其转换为新的(漂亮!)表示法: 让我感到困惑的是“ for segue:”中的“ for”。我知道为什么它在那里,但是它在语法上是什么样的元素?为参数命名, 或? 它仅仅是装饰吗?除了帮助开发人员理解上下文

  • 5.1. 函数声明 函数声明包括函数名、形式参数列表、返回值列表(可省略)以及函数体。 func name(parameter-list) (result-list) { body } 形式参数列表描述了函数的参数名以及参数类型。这些参数作为局部变量,其值由参数调用者提供。返回值列表描述了函数返回值的变量名以及类型。如果函数返回一个无名变量或者没有返回值,返回值列表的括号是可以省略的。如

  • 问题内容: 如果声明变量而不使用“ var”,则变量始终变为GLOBAL。 在函数内部声明全局变量是否有用?我可以想象在某个事件处理程序中声明一些全局变量,但这有什么用呢?更好地使用RAM? 问题答案: 不,没有RAM好处或类似的好处。 w3schools谈论的是我所说的“内隐全球性恐怖” 。考虑以下功能: 看起来很简单,但是由于线路上的错字,它返回,而不是。并创建一个带有输入错误名称的全局变量: