我与一个使用blockhash(block.number -1)
的函数有一个契约,我想测试它的值在挖掘了一个新块之后是否发生了变化。是否有办法在单元测试过程中以某种方式挖掘一个新块,或者使用Vm.sol
来更改blockhash
的返回值?
import "forge-std/Test.sol"
contract MyContract {
function someFunction() public returns (bytes32) {
return blockhash(block.number - 1); // Using blockhash
}
}
contract TestMyContract is Test {
MyContract myContract;
function setUp() public {
myContract = new MyContract();
}
function testResultChange() public {
bytes32 firstResult = myContract.someFunction();
// <--- Is it possible to change something here?
bytes32 secondResult = myContract.someFunction();
assertFalse(firstResult == secondResult);
}
}
发布于 2023-04-27 20:13:56
skip
和rewind
,但它们只用于更改时间戳:https://book.getfoundry.sh/reference/forge-std/skip我会尝试将计算和比较分成两个测试,伪编码如下:
contract TestMyContract is Test {
MyContract myContract;
bytes32 lastResult;
function setUp() public {
myContract = new MyContract();
}
function testRecordResult() public {
lastResult = myContract.someFunction();
}
function testResultChange() public {
bytes32 newResult = myContract.someFunction();
assertFalse(newResult == lastResult, "Value haven't changed");
}
}
免责声明:我还没试过。
ffi
以将结果保存在链外,并检查两次不同的测试运行。https://book.getfoundry.sh/forge/differential-ffi-testing?highlight=ffi#primer-the-ffi-cheatcode
block.timestamp
、prevrandao
、msg.sender
等。someFunction
成为一个纯函数,并将块哈希作为参数传递。它保证它会改变,你不需要测试它。您想测试您的代码是否为不同的块提供了不同的值?当然,根据您的业务逻辑,可能会有一些不同。https://ethereum.stackexchange.com/questions/149571
复制相似问题