Тесты с Foundry. Часть 3
Я также рекомендовал бы сразу подключить еще один служебный контракт в файл с тестами, а именно:
import "forge-std/console.sol";
Он позволит в тестах вызывать console.log() и получать нужные данные в терминале. Очень удобно, особенно, если вы хотите посмотреть какую-нибудь информацию об адресе или балансе.
Далее создаем переменные нашего контракта для теста:
Day public day;
По сути, благодаря Foundry нам не нужно прописывать getContractFactory, deploy, deployed, loadFixture, it тесты и много чего еще.
Идем дальше.
Порой нам нужно создать изначальные условия для контракта, что-то вроде положить на баланс токены, сделать минт nft и т.д. Для этого тут есть специальная функция:
function setUp() public {}
Именно в нее мы можем записать создание контрактов и передачу в их конструкторы какие-либо параметры. Например:
function setUp() public {
day = new Day(constructor params);
}
Теперь в остальных функциях тестов мы можем вызывать функции в контракте, как и обычно: day.increment().
Также существуют специальные Foundry Cheat Codes, которые позволяют выполнять специальные действия, в том числе эмулировать вызовы функций от имени других пользователей или контрактов, а также управлять block.timestamp, block.number, difficulty и остальными.
При этом не нужно писать длинные строки с await, достаточно в функции вызвать, например, vm.roll(100) и номер блока сразу изменится.
Также можно читать переменные, которые определяются в начале контракта, такие как owner. Для этого можно сделать так:
console.log(day.owner());
С помощью дополнительной библиотеки StdStorage можно также читать значения из слотов памяти.
Для того чтобы подключиться к вызову функции от другого аккаунта или контракта, как мы делали в hh connect(hacker), тут мы можем эмулировать действие, вызвав служебную функцию vm.prank(hacker). Дальше вызовы будут от данного адреса.
С адресами также все просто. Не обязательно запускать узел или использовать предустановленные адреса, можно также создать адрес для теста:
adderess alisa = address(0x01);
и дальше действовать уже от имени Алисы.
Это еще далеко не все, что можно делать с Foundry. Думаю завтра я посмотрю как делать fuzz тесты и напишу сюда.
А в следующем посте просто расскажу про команды для тестов в терминале.
#foundry
Post #573
246
- 👍 6