SafeMint函数单元测试报错排查及正确测试编写求助
问题修复方案
报错原因
触发TypeError: Assignment to constant variable的核心原因是:你在代码顶部用const声明了accounts常量,后续又在beforeEach钩子中尝试给这个常量重新赋值。const声明的变量无法被修改,直接导致赋值操作失败。
修复后的完整测试代码
const assert = require("assert"); const ComNFT = artifacts.require("ComNFT"); const { expect } = require("chai"); let accounts; let comNFT; beforeEach(async () => { accounts = await web3.eth.getAccounts(); comNFT = await ComNFT.new({ from: accounts[0] }); }); describe("ComNFT safeMint 测试", () => { it("非所有者调用safeMint应该失败", async () => { await expect( comNFT.safeMint(accounts[1], "token URI", { from: accounts[1] }) ).to.be.revertedWith("onlyOwner"); }); it("所有者应该能够成功铸造新代币", async () => { await comNFT.safeMint(accounts[1], "token URI", { from: accounts[0] }); const tokenURI = await comNFT.tokenURI(1); assert.equal(tokenURI, "token URI"); // 额外验证代币归属 const tokenOwner = await comNFT.ownerOf(1); assert.equal(tokenOwner, accounts[1]); }); });
关键调整说明
- 移除了
@openzeppelin/test-environment的accounts导入,改用web3.eth.getAccounts()获取账户列表,彻底解决常量赋值冲突问题 - 直接使用Truffle合约实例的
safeMint方法调用,替代手动构造交易的复杂写法,代码更简洁易维护 - 用Chai的
expect断言直接验证交易回滚信息,比原有的try-catch写法更直观 - 新增
ownerOf验证逻辑,确保铸造的代币归属符合预期
执行npx truffle test即可正常运行所有测试用例。
内容的提问来源于stack exchange,提问作者Golanger
相关产品推荐
相关产品推荐

