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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 19:00:07