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

Solidity状态变量更新事件日志正常但Truffle测试返回旧值如何解决

问题根因

你测试用例的执行逻辑没有等待setContract交易链上确认完成,就直接发起了状态查询请求,自然读到的是修改前的初始值:

  • intelPropertyDataHolder.setContract返回的是交易Promise对象,你使用了eventually.be.fulfilled断言但没有加await修饰,这行断言不会阻塞后续代码执行
  • 后续读取contractAddr的请求比setContract交易先完成,所以返回的是初始的零地址

修复方案

写法1:保留chai-as-promised断言,补充await

it('Set a contract address', async () => {
    let nftAddr = await intelPropertyNFT.address;
    // 加await等待断言执行完成,也就是等交易上链确认
    await expect(intelPropertyDataHolder.setContract(0, nftAddr)).to.eventually.be.fulfilled; 
    let nftContractAddress = await intelPropertyDataHolder.contractAddr(0);
    assert.equal(nftAddr, nftContractAddress);
});

写法2:先等待交易完成,再做校验(更易读)

it('Set a contract address', async () => {
    let nftAddr = await intelPropertyNFT.address;
    // 直接await交易执行完成,可选择接收交易回执做额外校验
    const txReceipt = await intelPropertyDataHolder.setContract(0, nftAddr);
    // 可选:校验交易触发的事件是否符合预期
    expect(txReceipt.logs[0].event).to.equal('SetContract');
    expect(txReceipt.logs[0].args._newContract).to.equal(nftAddr);
    
    let nftContractAddress = await intelPropertyDataHolder.contractAddr(0);
    assert.equal(nftAddr, nftContractAddress);
});

额外说明:你原代码中assert.equal前的await是多余的,普通同步断言不需要异步等待。

内容的提问来源于stack exchange,提问作者chrisb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 07:12:02