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

Truffle测试中如何向智能合约方法传入struct类型参数?

Truffle合约方法传struct类型参数的正确方案

你现有测试代码的失败有两个直接原因:

  1. initialize是区块链写入操作,属于异步方法,你没有加await等待交易执行完成,就直接调用getTitle读取状态,此时状态还没更新,自然返回空字符串
  2. 注意你的合约名定义为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 06:06:04