如何在Hardhat中测试已部署合约?Ethers.js v6适配问题
解决方案:Ethers.js v6下Hardhat测试已部署合约
1. 先修复代码中的低级错误
你的测试代码里存在拼写错误:getContractFactrory → getContractFactory(少了字母o),这会直接导致函数调用失败。
2. Ethers.js v6下连接已部署合约的两种正确方式
方式一:使用getContractFactory + attach(兼容原有写法)
在Hardhat环境中,即使升级到Ethers.js v6,ethers.getContractFactory仍可正常使用,修正拼写后即可:
const { expect } = require("chai") const { ethers } = require("hardhat") require("dotenv").config({path: "/home/ardakl/blockchain-tutorials/hardhat/.env"}) describe("StarDucks", () => { let starDucks, tokenSale; before("Get the signers and contracts", async() => { // 修复拼写错误 const StarDucks = await ethers.getContractFactory("StarDucks") starDucks = await StarDucks.attach("0x1613beB3B2C4f22Ee086B2b38C1476A3cE7f78E8") const TokenSale = await ethers.getContractFactory("TokenSale") tokenSale = await TokenSale.attach("0x851356ae760d987E095750cCeb3bC6014560891C") }) it("Should not have any tokens in my deployer account", async() => { // balanceOf是异步函数,必须加await const balance = await starDucks.balanceOf("0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266") expect(balance).to.equal(0) }) })
方式二:直接使用ethers.getContractAt(更简洁)
Ethers.js v6推荐直接用getContractAt连接已部署合约,无需先获取工厂,写法更简洁:
const { expect } = require("chai") const { ethers } = require("hardhat") require("dotenv").config({path: "/home/ardakl/blockchain-tutorials/hardhat/.env"}) describe("StarDucks", () => { let starDucks, tokenSale; before("Get the signers and contracts", async() => { // 直接用getContractAt连接合约 starDucks = await ethers.getContractAt("StarDucks", "0x1613beB3B2C4f22Ee086B2b38C1476A3cE7f78E8") tokenSale = await ethers.getContractAt("TokenSale", "0x851356ae760d987E095750cCeb3bC6014560891C") }) it("Should not have any tokens in my deployer account", async() => { const balance = await starDucks.balanceOf("0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266") expect(balance).to.equal(0) }) })
3. 额外注意事项
- 异步操作必须加
await:balanceOf是异步函数,未加await会返回Promise对象而非实际余额,导致测试失败。 - 环境变量路径校验:确保
.env文件路径配置正确,避免因路径错误导致环境变量无法加载。 - Hardhat版本适配:建议使用最新版Hardhat以兼容Ethers.js v6,可通过
npm install hardhat@latest更新。
内容的提问来源于stack exchange,提问作者Arda Karahan
相关产品推荐
相关产品推荐

