智能合约代码:
function mintWhitelist() external {
uint256 totalMinted = totalSupply();
require(totalMinted < MAX, "All minted");
uint256 whitelistAmount = whitelistNumber[msg.sender];
require(whitelistAmount > 0, "Not in whitelist");
...
}
测试代码:
function test_mintWhitelist() public {
vm.mockCall(
address(addrContract),
abi.encodeWithSelector(contract.totalSupply.selector),
abi.encode(MAX)
);
assertEq(Contract.totalSupply(), MAX);
vm.expectRevert("All minted");
vm.prank(USER3);
contract.mintWhitelist();
}
测试结果:
[FAIL. Reason: Error != expected error: Not in whitelist != All minted] test_mintWhitelist_Part1() (gas: 18900)
Traces:
[18900] ContractTest::test_mintWhitelist_Part1()
├─ [0] VM::mockCall(Contract: [0x1a94a1Ae151C8e66Fb3a2E8843144969Bd2efc28], 0x18160ddd, 0x0000000000000000000000000000000000000000000000000000000000015b38)
│ └─ ← ()
├─ [0] Contract::totalSupply() [staticcall]
│ └─ ← 10000 [1e4]
├─ [0] VM::expectRevert(All minted)
│ └─ ← ()
├─ [0] VM::prank(0x0000000000000000000000000000000000000003)
│ └─ ← ()
├─ [6811] Contract::mintWhitelist()
│ └─ ← "Not in whitelist"
└─ ← "Error != expected error: Not in whitelist != All minted"
从 Trace 可以看到,totalSupply() 已经变成了 10000,可是为什么测试到 mint 函数的时候,没有报 All minted 错误呢?