3分钟Solidity: 14.4 Foundry事件测试

0 阅读1分钟

欢迎订阅专栏3分钟Solidity--智能合约--Web3区块链技术必学

Foundry事件

要获取此内容的最新版本,请访问 Cyfrin.io 上的 Foundry事件(代码示例)

// SPDX-License-Identifier: MIT
pragma solidity 0.8.26;

import "forge-std/Test.sol";

contract Event {
    event Transfer(address indexed from, address indexed to, uint256 amount);

    function transfer(address from, address to, uint256 amount) external {
        emit Transfer(from, to, amount);
    }

    function transferMany(
        address from,
        address[] calldata to,
        uint256[] calldata amounts
    ) external {
        for (uint256 i = 0; i < to.length; i++) {
            emit Transfer(from, to[i], amounts[i]);
        }
    }
}

contract EventTest is Test {
    Event public e;

    event Transfer(address indexed from, address indexed to, uint256 amount);

    function setUp() public {
        e = new Event();
    }

    function testEmitTransferEvent() public {
        // function expectEmit(
        //     bool checkTopic1,
        //     bool checkTopic2,
        //     bool checkTopic3,
        //     bool checkData
        // ) external;

        // 1. 告诉Foundry要检查哪些数据
        // 检查索引1、索引2和数据
        vm.expectEmit(true, true, false, true);
        // 2. 发出预期事件
        emit Transfer(address(this), address(123), 456);
        // 3. 调用应发出事件的函数
        e.transfer(address(this), address(123), 456);

        // 仅检查索引1
        vm.expectEmit(true, false, false, false);
        emit Transfer(address(this), address(123), 456);
        // 注意:索引2和数据(数量)不匹配
        // 但测试仍将通过
        e.transfer(address(this), address(111), 222);
    }

    function testEmitManyTransferEvent() public {
        address[] memory to = new address[](2);
        to[0] = address(111);
        to[1] = address(222);

        uint256[] memory amounts = new uint256[](2);
        amounts[0] = 1;
        amounts[1] = 2;

        for (uint256 i = 0; i < to.length; i++) {
            // 1. 告诉Foundry要检查哪些数据
            vm.expectEmit(true, true, false, true);
            // 2. 发出预期事件
            emit Transfer(address(this), to[i], amounts[i]);
        }

        // 3. 调用应发出事件的函数
        e.transferMany(address(this), to, amounts);
    }
}

Try on Remix