使用Foundry为银行合约的 DepositETH 方法编写单元测试

  • 链创通
  • 更新于 2024-07-11 20:20
  • 阅读 644

使用Foundry为银行合约的 DepositETH 方法编写单元测试

使用Foundry为银行合约的 DepositETH 方法编写单元测试

Foundry的安装使用,请参考官网的官方文档:https://getfoundry.sh

创建项目初始化项目

forge init DepositETH

image-20240710162111838.png

创建成功后用vscode打开,可以看到项目文件结构

image-20240710162639434.png 在文件夹src中新建 Bank.sol 合约代码如下:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Bank {
    mapping(address => uint) public balanceOf;

    event Deposit(address indexed user, uint amount);

    function depositETH() external payable {
        require(msg.value > 0, "Deposit amount must be greater than 0");
        balanceOf[msg.sender] += msg.value;
        emit Deposit(msg.sender, msg.value);
    }
}

接下来,我们编写 BankTest.sol 测试合约,使用 Foundry 框架进行单元测试。这个测试合约将包括两个主要测试用例:检查 Deposit 事件和检查存款前后用户的存款额更新。

test文件夹下BankTest.sol 测试合约代码如下:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "forge-std/Test.sol";
import "./Bank.sol";

contract BankTest is Test {
    Bank bank;

    function setUp() public {
        bank = new Bank();
    }

    function testDepositETH() public {
        // 记录初始余额
        uint initialBalance = bank.balanceOf(address(this));
        uint depositAmount = 1 ether;

        // 断言存款事件
        vm.expectEmit(true, true, false, true);
        emit Deposit(address(this), depositAmount);

        // 执行存款操作
        bank.depositETH{value: depositAmount}();

        // 检查存款后的余额
        uint newBalance = bank.balanceOf(address(this));
        assertEq(newBalance, initialBalance + depositAmount);
    }

    // 自定义事件声明
    event Deposit(address indexed user, uint amount);
}

说明:

  1. 导入 Foundry 的 Test 库import "forge-std/Test.sol";
  2. 合约声明BankTest 继承自 Test 合约。
  3. setUp 函数:在每个测试函数之前运行,用于部署新的 Bank 合约实例。
  4. testDepositETH 函数:用于测试 depositETH 方法。
    • 记录初始余额。
    • 设置期望的事件输出。
    • 调用 depositETH 方法,并传递指定数量的 ETH。
    • 检查存款后的余额是否正确更新。
    • 自定义事件声明 Deposit 用于事件断言。

运行测试

确保你已经安装了 Foundry,并且在项目根目录下包含 foundry.toml 配置文件。然后运行以下命令来执行测试:

forge test

这样就可以检查 Bank 合约的 depositETH 方法是否正常工作,包括事件输出和余额更新。

image-20240710172233934.png

点赞 1
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
链创通
链创通
0x5312...1e69
歪脖山徒步虾