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
相关产品推荐
相关产品推荐

