如何为具有返回值的函数测试异常?

时间:2019-07-22 08:00:42

标签: solidity

我正在为智能合约编写单元测试。我想介绍异常测试。在this tutorial之后,我可以使用测试代理来测试不会返回任何内容的函数。但是,在测试具有返回值的函数时出现错误。

这是要测试的合同:

pragma solidity >=0.5.0 <0.6.0;

contract ContractA {
    uint256 public count;

    constructor(uint256 init) public {
        count = init;
    }

    function add(uint256 val) public returns(uint256) {
        require(val > 0);
        count = count + val;

        return count;
    }
}

这是测试代理:

pragma solidity >=0.5.0 <0.6.0;

contract TestProxy {
  address public target;
  bytes data;

  constructor(address _target) public {
    target = _target;
  }

  function() external payable {
    data = msg.data;
  }

  function execute() public returns (bool success, bytes memory response) {
    (success, response) = target.call(data);
  }
}

这是测试合同:

pragma solidity >=0.4.0 <0.6.0;
import "remix_tests.sol"; // this import is automatically injected by Remix.
import "./TestProxy.sol";
import "./ContractA.sol";

// file name has to end with '_test.sol'
contract TestContractA {
  function testAdd() public {
    ContractA conA = new ContractA(1);
    TestProxy tp = new TestProxy(address(conA));        
    ContractA(address(tp)).add(0);        
    (bool r,) = tp.execute.gas(20000)();
    Assert.equal(r, false, "the call should fail");
}

测试出现此错误:

Transaction has been reverted by the EVM: { "transactionHash": "0xb4603e0ba5dbc2d96511a38a01113c586252baccff1e3f7029ad7abc8994aecc", "transactionIndex": 0, "blockHash": "0x766d18646a06cf74faeabf38597314f84a82c3851859d9da9d94fc8d037269e5", "blockNumber": 6, "gasUsed": 406623, "cumulativeGasUsed": 406623, "status": false, "events": {} }

我想知道这是扎实的已知问题还是局限性,或者我错过了某些事情?我找到了解决方法。但是,如果这是可靠的错误,则最好进行修复。

1 个答案:

答案 0 :(得分:0)

使用Web3,当您发送一笔交易时,您将获得TX收据或一条还原消息,如您收到的一样。您无法检索返回值。

注意:不要与通话混淆。如果您调用一个函数,则可以获得返回值。但是,如果您发送一个tx,则不会。 呼叫不会修改状态,但是发送会修改状态。

使用openzeppelin-test-helpers测试EVM还原。

看看:https://github.com/OpenZeppelin/openzeppelin-test-helpers/blob/master/src/expectRevert.js

相关问题