首页 > 解决方案 > 如何在松露中测试应付方法?

问题描述

我正在尝试在松露框架中测试智能合约的支付方法:

contract Contract {
  mapping (address => uint) public balances;

  function myBalance() public view returns(uint) {
    return balances[msg.sender];
  }

  function deposit() external payable {
    balances[msg.sender] += msg.value;
  }
}

contract TestContract {

  function testDeposit() external payable {
    Contract c = new Contract();

    c.deposit.value(1);

    Assert.equal(c.myBalance(), 1, "#myBalance() should returns 1");
  }
}

在我运行之后truffle test,它失败并TestEvent(result: <indexed>, message: #myBalance() should returns 1 (Tested: 0, Against: 1))出现错误。为什么?

标签: testingethereumsoliditysmartcontractstruffle

解决方案


您的测试合同有几个问题。首先是你没有初始化你的测试合约来持有任何以太币。因此,没有持有的资金TestContract要发送到Contract。为此,您需要设置一个initialBalance合约存储变量(请参阅测试以太交易)。

其次,你没有deposit正确调用你的函数。要调用函数并发送以太币,格式为contract.functionName.value(valueInWei)(<parameter list>).

这是固定版本TestContract

contract TestContract {
  uint public initialBalance = 1 wei;

  function testDeposit() external payable {
    Contract c = new Contract();

    c.deposit.value(1)();

    Assert.equal(c.myBalance(), 1, "#myBalance() should returns 1");
  }
}

推荐阅读