You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将测试代码从.then转为async/await后无法运行,求修正方案

修正你的async/await测试代码问题

我来帮你排查下问题,然后给出可以正常运行的async/await版本代码:

问题分析

对比你的两段代码,主要有这几个导致async版本失效的点:

  • 金额参数类型不匹配:async版本里你传了字符串"9999999999999999",但正常的then版本是数字9999999999999999999,不仅类型错误,数值位数也少了一位,导致合约触发的错误逻辑不匹配。
  • 缺少主动失败断言:then版本里用.then(assert.fail)确保如果转账调用没抛出错误的话测试直接失败,但async版本里没有这个逻辑,要是调用意外成功,测试会直接结束而不进入catch块。
  • 错误断言关键词不一致:async版本里判断错误包含"revert",但then版本里实际是判断"invalid",这会导致断言失败。
  • 缺少后续正确调用:then版本在捕获错误后还执行了一次合法的转账调用,async版本里遗漏了这部分测试逻辑。

修正后的代码

it("transfers token ownership", async () => {
  tokenInstance = await DappToken.deployed();
  try {
    // 用数字类型的金额,和then版本保持一致
    await tokenInstance.transfer.call(accounts[1], 9999999999999999999);
    // 如果走到这一步说明调用没抛出错误,主动让测试失败
    assert.fail("Expected error didn't occur");
  } catch (error) {
    console.log("error ", error);
    // 和then版本对齐,判断错误信息包含"invalid"
    assert(
      error.message.toString().indexOf("invalid") >= 0,
      "Error message must contain invalid"
    );
    // 执行合法的转账调用,补全测试逻辑
    await tokenInstance.transfer.call(accounts[1], 250000, { from: accounts[0] });
  }
});

关键修正说明

  1. 统一参数类型和数值:把金额改成数字类型,并且和then版本的数值完全一致,确保触发合约预期的错误逻辑。
  2. 添加assert.fail:在await调用之后加上这一行,模拟then版本里.then(assert.fail)的作用,确保如果调用意外成功时测试会直接失败。
  3. 对齐错误断言逻辑:把断言里的关键词从"revert"改成"invalid",和原有的正确测试逻辑保持一致。
  4. 补全后续测试步骤:在catch块末尾加上合法的转账调用,完成整个测试流程,和then版本的最后一步对应。

另外要注意,在async/await风格的测试里,所有异步操作都必须加上await,保证测试框架等待所有操作完成后再结束测试,避免出现测试提前终止的问题。

内容的提问来源于stack exchange,提问作者Hendry Lim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:09:20