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

