将测试代码从.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] }); } });
关键修正说明
- 统一参数类型和数值:把金额改成数字类型,并且和then版本的数值完全一致,确保触发合约预期的错误逻辑。
- 添加assert.fail:在await调用之后加上这一行,模拟then版本里
.then(assert.fail)的作用,确保如果调用意外成功时测试会直接失败。 - 对齐错误断言逻辑:把断言里的关键词从
"revert"改成"invalid",和原有的正确测试逻辑保持一致。 - 补全后续测试步骤:在catch块末尾加上合法的转账调用,完成整个测试流程,和then版本的最后一步对应。
另外要注意,在async/await风格的测试里,所有异步操作都必须加上await,保证测试框架等待所有操作完成后再结束测试,避免出现测试提前终止的问题。
内容的提问来源于stack exchange,提问作者Hendry Lim
相关产品推荐
相关产品推荐

