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

如何在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,提问作者荣致栋

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 20:32:16