如何使用Hardhat/Chai直接测试Solidity库 解决libTest未定义报错
问题根因
报错来自两个独立问题:
- 变量作用域错误:
beforeEach钩子内用const声明的libTest属于块级作用域变量,仅能在钩子函数内部访问,外层的it测试块无法读取该变量,直接触发引用错误。 - Solidity库的使用逻辑错误:Library设计上不会作为独立合约被直接调用,就算修复作用域问题,直接部署后调用的写法也不符合库的运行规则。
修复方案
方案1:Mock合约包裹调用(最贴合生产场景,推荐)
库在实际使用中都是被其他合约链接调用,写一个极简Mock合约做中转是最稳妥的测试方式:
- 新增测试用Mock合约代码:
import "./LibTest.sol"; contract MockLibTest { function testLibFunc() external view returns(bool) { return LibTest.testFunc(); } }
- 修正测试代码的作用域问题,部署时正确链接库:
// 将实例声明提升到describe块顶层作用域,供所有测试用例访问 let libTest; beforeEach(async () => { // 先部署库合约 const LibTestFactory = await ethers.getContractFactory("LibTest"); const libInstance = await LibTestFactory.deploy(); await libInstance.deployed(); // 部署Mock合约时关联已部署的库地址 const MockFactory = await ethers.getContractFactory("MockLibTest", { libraries: { LibTest: libInstance.address } }); libTest = await MockFactory.deploy(); await libTest.deployed(); }) describe('Testing test()', function () { it("is working testFunc ?", async function () { const res = await libTest.testLibFunc(); console.log(res); }) })
方案2:直接静态调用(无需写Mock,适合简单函数快速测试)
如果不想额外写Mock合约,可以直接用callStatic方式调用部署后的库方法,只需要修复作用域即可:
let libTest; beforeEach(async () => { const LibTest = await ethers.getContractFactory("LibTest"); libTest = await LibTest.deploy(); await libTest.deployed(); }) describe('Testing test()', function () { it("is working testFunc ?", async function () { // 静态调用view方法,不触发状态变更 const res = await libTest.callStatic.testFunc(); console.log(res); }) })
内容的提问来源于stack exchange,提问作者rastafalow
相关产品推荐
相关产品推荐

