mockFunction

签名

function mockFunction(address callee, address target, bytes calldata data) external;

描述

如果调用数据严格或宽松地匹配 data,则执行对地址 callee 的调用,使用地址 target 的字节码。

当对 callee 进行调用时,首先检查调用数据是否与 data 完全匹配。 如果不匹配,则检查调用数据是否在函数选择器上有部分匹配。

如果找到匹配,则使用 target 地址的字节码执行调用。

ℹ️ 隔离测试

如果使用隔离测试模式,此作弊码当前无法工作。

示例

对于两个合约(具有相同的存储布局):

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;
    }
}

模拟对 count 函数的精确调用:

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);
}

模拟对 count 函数的所有调用:

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);
}