Truffle测试Solidity合约时调用变更方法后状态未更新是什么原因?
问题原因
你的智能合约本身逻辑没有问题,状态未变更的核心原因是Truffle测试代码的异步流程处理错误:
- 调用合约写入类方法(会修改链上状态的
changeProperty方法)属于异步操作,会返回Promise对象。你在对应then回调中没有将这个Promise return出去,导致后续执行逻辑不会等待这笔交易打包上链、状态生效,就直接读取了contractProperty的值,此时读到的自然是修改前的初始值10。
修复方案
仅需要在testInstance.changeProperty(10000)前添加return即可,修改后的对应代码片段如下:
.then(() => { return testInstance.changeProperty(10000); })
你也可以改用async/await写法降低异步逻辑出错概率,参考完整测试代码:
const SmartContract = artifacts.require("SmartContract"); contract('SmartContract', function(accounts) { it('returns correctly', async () => { const testInstance = await SmartContract.deployed(); // 等待修改状态的交易确认完成 await testInstance.changeProperty(10000); const val = await testInstance.contractProperty(); assert.equal(val.toString(), '10000'); }); });
内容的提问来源于stack exchange,提问作者geo10
相关产品推荐
相关产品推荐

