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
相关产品推荐
相关产品推荐

