Hardhat中合约调用失败后如何继续执行剩余测试代码?
在Hardhat中处理合约调用失败的测试场景
当合约调用故意失败时,未处理的Promise拒绝会直接终止测试块,导致后续代码无法执行。解决这个问题有两种常用方法:
方法一:用try/catch捕获错误
把会失败的合约调用包裹在try/catch块里,捕获错误后就能继续执行后续代码,还能在catch里验证错误细节:
// some code 1 try { await contract.function() } catch (error) { // 可选:验证错误信息是否符合预期 if (!error.message.includes("预期的错误关键字")) { throw new Error("合约调用失败的错误不符合预期") } } // some code 2 现在会正常执行
方法二:用Hardhat集成的expect.reverts断言
这是Hardhat测试里更规范的写法,专门用来验证合约调用失败的场景,执行后不会终止测试:
// some code 1 // 预期调用会失败,可指定预期的错误消息(可选) await expect(contract.function()).to.be.revertedWith("自定义错误信息") // some code 2 会正常执行
两种方法的选择:
- 如果需要在捕获错误后做额外的自定义逻辑(比如处理错误数据),用try/catch更灵活;
- 如果只是验证合约调用是否按预期失败,expect.reverts写法更简洁,符合测试框架的最佳实践。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

