function mockFunction(address callee, address target, bytes calldata data) external;
Executes calls to an address callee
with bytecode of address target
if the call data either strictly or loosely matches data
.
When a call is made to callee
the call data is first checked to see if it matches in its entirety with data
.
If not, the call data is checked to see if there is a partial match on function selector.
If a match is found, then call is executed using the bytecode of target
address.
ℹ️ Isolated tests
This cheatcode does not currently work if using isolated test mode.
For two contracts (with same storage layout):
contract Counter {
uint256 public a;
function count(uint256 x) public {
a = 321 + x;
}
}
contract ModelCounter {
uint256 public a;
function count(uint256 x) public {
a = 123 + x;
}
}
Mocking an exact call to count
function:
function testMockFunction() public {
vm.mockFunction(
address(counter),
address(model),
abi.encodeWithSelector(Counter.count.selector, 456)
);
counter.count(456);
assertEq(counter.a(), 123 + 456);
counter.count(567);
assertEq(counter.a(), 321 + 567);
}
Mocking all calls to count
function:
function testMockCall() public {
vm.mockFunction(
address(counter),
address(model),
abi.encodeWithSelector(Counter.count.selector)
);
counter.count(678);
assertEq(counter.a(), 123 + 678);
counter.count(789);
assertEq(counter.a(), 123 + 789);
}