Truffle测试中如何向智能合约方法传入struct类型参数?
Truffle合约方法传struct类型参数的正确方案
你现有测试代码的失败有两个直接原因:
initialize是区块链写入操作,属于异步方法,你没有加await等待交易执行完成,就直接调用getTitle读取状态,此时状态还没更新,自然返回空字符串- 注意你的合约名定义为
StructParams,但测试代码中写的是StructParam.deployed(),少了末尾的s,也会导致部署实例异常。
Truffle支持两种struct参数传入方式,均可正常使用:
方式1:按struct字段顺序传数组(和Remix用法一致)
按solidity中struct定义的字段顺序依次传入值即可,写法如下:
it('initializes', async() => { let sp = await StructParams.deployed(); let s = ["My Little Pony", "Hasbro", 2]; // 必须加await等待交易确认 await sp.initialize(s); let retval = await sp.getTitle(); assert.equal(retval,"My Little Pony"); console.log("title", retval); })
方式2:按键值对对象传入(更推荐,可读性更高)
直接传入和struct字段名对应的JSON对象,不需要关注顺序,不容易出错:
it('initializes', async() => { let sp = await StructParams.deployed(); let params = { title: "My Little Pony", creator: "Hasbro", editionLimit: 2 }; await sp.initialize(params); let retval = await sp.getTitle(); assert.equal(retval,"My Little Pony"); })
注意事项
- 所有修改链上状态的合约方法调用,都必须加
await等待交易打包确认后,再读取后续状态 - 若使用数组传参,顺序必须和struct定义的字段顺序完全一致;若使用对象传参,字段名必须和struct定义的字段名完全一致,大小写也要匹配
内容的提问来源于stack exchange,提问作者GGizmos
相关产品推荐
相关产品推荐

