Wie kann ich mit dem Trüffeltest testen, ob eine Funktion überlauffest ist?
contract SafeMath{
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
assert(c >= a);
return c;
}
}
contract TestSafeMath{
function test_add_10_and_max_should_return_err() {
uint256 max = 2**256 - 1;
uint256 expected = "revert overflow error";
Assert.errorsEqual(SafeMathExt.add(10, max), expected, "Addition of 10 and max should revert");
}
}
TestSafeMath 1) test_add_max_and_10_should_return_err No events were emitted 1 failing
Wie kann ich diesen Test bestehen?
Ich weiß eigentlich nicht, wie Ihr Code kompilieren kann, das ist offensichtlich ein Problem
uint256 expected = "revert overflow error";
und auch die Methode errorsEqual der Assert- Bibliothek erwartet zwei Fehlercodes
Wie auch immer, eine Möglichkeit, dies zu umgehen, wäre der Versuch, einen Raw-Aufruf zu tätigen, um zu testen, ob es innerhalb der VM einen Wiederherstellungsstatus gibt. Die Call-Methode gibt true zurück, wenn der Aufruf korrekt ausgeführt wurde, andernfalls false.
pragma solidity ^0.4.19;
import "truffle/Assert.sol";
import "truffle/DeployedAddresses.sol";
import "../contracts/SafeMath.sol";
contract TestSafeMath {
SafeMath instance;
constructor() public {
instance = SafeMath(DeployedAddresses.SafeMath());
}
function testAdd_10_and_max_should_return_err() public {
uint256 max = 2**256 - 1;
bool passed = address(instance).call(bytes4(keccak256("add(uint256,uint256)")), 10, max);
Assert.isFalse(passed, "test should fail");
}
function testAdd_10_and_10_should_be_ok() public {
uint256 value = 10;
bool passed = address(instance).call(bytes4(keccak256("add(uint256,uint256)")), 10, value);
Assert.isTrue(passed, "test should not fail");
Assert.equal(instance.add(10, value), value + 10, "should be 20");
}
}
Um den tatsächlichen Wert zu erhalten, müssen Sie die Methode erneut aufrufen, da der Rohaufruf Ihnen keinen Rückgabewert liefert (siehe zweite Testmethode).
Ausgang
TestSafeMath
✓ testAdd_10_and_max_should_return_err (53ms)
✓ testAdd_10_and_10_should_be_ok (66ms)
2 passing (987ms)