使用Foundry为银行合约的 DepositETH 方法编写单元测试
使用Foundry为银行合约的 DepositETH 方法编写单元测试
Foundry的安装使用,请参考官网的官方文档:https://getfoundry.sh
创建项目初始化项目
forge init DepositETH
创建成功后用vscode打开,可以看到项目文件结构
在文件夹
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);
}
import "forge-std/Test.sol";
BankTest
继承自 Test
合约。Bank
合约实例。depositETH
方法,并传递指定数量的 ETH。Deposit
用于事件断言。确保你已经安装了 Foundry,并且在项目根目录下包含 foundry.toml
配置文件。然后运行以下命令来执行测试:
forge test
这样就可以检查 Bank
合约的 depositETH
方法是否正常工作,包括事件输出和余额更新。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!