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

如何在Truffle的Solidity测试中调用带转账值和指定发件人的合约函数

解决方案

首先修正你测试合约中的导入错误:你当前导入的是TicketsRoutes.sol,但测试目标是ContractA,需要把导入语句改为:

import "../contracts/ContractA.sol";

以下是不同测试场景下的实现方法:

1. 继续使用Solidity编写测试

1.1 仅需传入指定转账金额

如果不需要指定调用方,默认以测试合约本身作为交易发起者,直接在函数调用时加上{value: 金额}参数即可传递ETH,单位为wei:

function testBuying() public {
    // 传入10 wei满足price校验要求
    instance.buySomething{value: 10}();
    Assert.equal(instance.boughtItems, 1, "Routes amount is not equal");
}

1.2 需指定其他地址作为交易发起方

Truffle原生Solidity测试框架没有内置模拟其他地址发起调用的作弊码,实现成本较高,更推荐切换到JavaScript测试来实现该需求。

2. 改用JavaScript测试(更灵活,推荐)

Truffle的JavaScript测试可以非常方便的自定义交易发起方和转账金额,在test目录下新建contractA.test.js,编写如下代码即可:

const ContractA = artifacts.require("ContractA");

// accounts参数会自动注入Truffle测试环境的所有可用账号
contract("ContractA", (accounts) => {
  // 你需要的指定发起地址,也可以直接使用accounts数组中的内置测试账号
  const account1 = "0xD8Ce37FA3A1A61623705dac5dCb708Bb5eb9a125";

  it("验证buySomething方法逻辑", async () => {
    const instance = await ContractA.new();
    // from指定交易发起地址,value指定转账金额(单位为wei)
    await instance.buySomething({ from: account1, value: 10 });
    const boughtItems = await instance.boughtItems();
    assert.equal(boughtItems.toNumber(), 1, "购买数量校验失败");
  });
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 05:15:02