我正在为智能合约编写单元测试。我想介绍异常测试。在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": {} }
我想知道这是扎实的已知问题还是局限性,或者我错过了某些事情?我找到了解决方法。但是,如果这是可靠的错误,则最好进行修复。
答案 0 :(得分:0)
使用Web3,当您发送一笔交易时,您将获得TX收据或一条还原消息,如您收到的一样。您无法检索返回值。
注意:不要与通话混淆。如果您调用一个函数,则可以获得返回值。但是,如果您发送一个tx,则不会。 呼叫不会修改状态,但是发送会修改状态。
使用openzeppelin-test-helpers
测试EVM还原。
看看:https://github.com/OpenZeppelin/openzeppelin-test-helpers/blob/master/src/expectRevert.js