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

Hardhat单元测试报错:No Contract deployed with name Raffle

Hardhat单元测试报错No Contract deployed with name Raffle 排查方案

问题场景

  • 基于Hardhat开发链上抽奖Raffle合约,单独执行合约部署逻辑可正常运行
  • 单元测试逻辑:非开发链自动跳过测试,开发链下在beforeEach钩子中通过deployments.fixture(["all"])执行全量合约部署,再通过ethers.getContract获取Raffle、VRFCoordinatorV2Mock合约实例,验证构造函数初始化逻辑
  • 执行hh test后控制台仅输出mock合约部署成功日志,beforeEach钩子执行失败,0个用例通过,核心报错如下:

Error: No Contract deployed with name Raffle
at Object.getContract (node_modules/@nomiclabs/hardhat-ethers/src/internal/helpers.ts:447:11)
at Context. (test/unit/Raffle.test.js:16:24)

报错根因

const { deployer } = await getNamedAccounts() 这行代码没有问题,报错核心是执行deployments.fixture(["all"])时,Raffle合约根本没有被部署到测试网络,ethers.getContract找不到对应部署产物:

  • 90%以上概率是Raffle合约对应的部署脚本没有添加"all"标签,fixture执行时仅触发了带all标签的VRFCoordinatorV2Mock部署脚本,完全没跑Raffle的部署流程,和控制台仅输出mocks部署日志的现象完全吻合
  • 小概率是Hardhat配置缺失hardhat-deploy-ethers依赖,导致ethers.getContract无法读取hardhat-deploy生成的部署产物

解决步骤

  • 第一步:打开deploy目录下Raffle对应的部署脚本,在脚本末尾添加all标签配置,参考格式如下:
// Raffle部署脚本末尾补充
module.exports.tags = ["all", "raffle"]
  • 第二步:检查hardhat.config.js的依赖引入,确保已正确安装并引入hardhat-deploy-ethers包,注意不要和原生@nomiclabs/hardhat-ethers冲突:
// hardhat.config.js 头部引入
require("@nomiclabs/hardhat-waffle")
require("hardhat-deploy")
require("hardhat-deploy-ethers")
  • 第三步:清理Hardhat缓存后重新执行测试:
hh clean
hh test

正常执行后控制台会打印Raffle合约的部署日志,合约实例可正常获取,测试用例即可正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:42:28