如何在Truffle测试用例中指定调用合约的账户地址?
修改Truffle调用合约时使用的账户地址
已成功通过Truffle获取默认合约地址,现在需要修改在Truffle中调用合约时使用的账户地址。相关合约代码和测试代码如下:
合约代码:step3.sol
pragma solidity ^0.8.20; contract step3 { address owner; // 状态变量 constructor() { owner = msg.sender; } function sayHello() external view returns(address a){ if(owner==msg.sender) { return msg.sender; } string memory greeting ="hello world"; // 局部变量 return msg.sender; } }
测试代码:check.js
// 定义变量表示合约 const step3 = artifacts.require('step3.sol'); // 合约测试逻辑 contract('step3',accounts => { before(async () => { let a = await step3.deployed(); let c = await a.sayHello(); console.log("调用greets 方法:入参:无,回参:"+c); console.log(accounts) }); it('检查合约是否部署成功', async () => { }); });
修改调用账户的两种实用方法
方法1:调用合约方法时指定from参数
Truffle调用合约外部方法时,可通过from选项直接指定使用的账户。修改check.js中的调用逻辑即可:
let c = await a.sayHello({ from: accounts[1] }); // 使用测试账户列表中的第二个账户
accounts是Truffle自动注入的测试账户数组,默认包含10个带余额的测试账户,你可以指定任意下标对应的账户,也可以直接传入自定义的合法账户地址(需确保该账户在当前网络有可用余额)。
方法2:统一设置测试用例的目标账户
如果需要整个测试流程都使用特定账户,可提前定义目标账户,在所有调用中复用:
contract('step3', (accounts) => { const targetAccount = accounts[2]; // 选定目标账户 before(async () => { let a = await step3.deployed(); let c = await a.sayHello({ from: targetAccount }); console.log("调用greets 方法:入参:无,回参:"+c); console.log("使用的账户地址:", targetAccount); }); it('检查合约是否部署成功', async () => { let instance = await step3.deployed(); let result = await instance.sayHello({ from: targetAccount }); assert.equal(result, targetAccount, "返回地址应与调用账户一致"); }); });
注意事项
- 确保指定的账户在当前连接的Truffle测试网络(如Ganache)中有足够ETH余额,否则会触发调用失败。
- 使用自定义账户地址时,需确保该账户已导入到当前Truffle环境或连接的节点中。
内容的提问来源于stack exchange,提问作者荣致栋
相关产品推荐
相关产品推荐

