Разбор тестов краудфандинга. Часть 3
Обратите внимание, что тесты в этом случае писались с использованием typescript, и расширение файла - .ts.
В этих тестах меня привлекло следующее решение лектора. Он создал отдельный файл "setup.ts", куда импортировал:
import {loadFixture, time} from "@nomicfoundation/hardhat-network-helpers";
import {ethers} from "hardhat";
import {expect} from "chai";
import "#nomicfoundation/hardhat-chai-matchers";
export {loadFixture, ethers, expect, time};
а уже в рабочем файле тестов одной строкой получил все необходимое оттуда:
import { loadFixture, ethers, expect, time } from "./setup";
Также импортируются типы для контрактов:
import type { LowkickStarter } from "../typechain-types";
import { Campaign__factory } from "../typechain-types";
Если не понимаете, о чем идет речь, то поищите урок на канале про typechains.
В начале теста нам необходимо делать деплой контракте с помощью функции dep(). Здесь также все как обычно просто.
И, наконец, сам тест.
Прежде всего получаем необходимые данные для работы через:
const { lowkick, owner, pledger } = await loadFixture(dep);
Далее нам нужно создать дочерний контракт, вызвав функцию strat() в нем. Тут интерес представляет строка, где устанавливается продолжительность кампании:
const endsAt = Math.floor(Date.now() / 1000) + 30;
Дело в том, что в javascript время исчисляется в миллисекундах, а в контрактах - в секундах. Поэтому нам нужно привести все к общему знаменателю таким способом.
Затем мы получаем адрес нашего контракта, вытаскивая его по id из mapping родительского контракта с ключом targetContract.
Также нам нужно подключиться к этому адресу, как владелец контракта и как пользователь, которых хочет сделать взнос.
const campaignAsOwner = Campaign__factory.connect(campaignAddr,owner);
const campaignAsPledger = Campaign__factory.connect(campaignAddr,pledger);
Проводим первый тест, сравнивая продолжительность кампании:
expect(await campaignAsOwner.endsAt()).to.eq(endsAt);
Второй тест, что организатор не сможем забрать деньги до окончания кампании:
await expect(campaignAsOwner.claim()).to.be.reverted;
и сама кампания не будет исполненной:
expect((await lowkick.campaigns(1)).claimed).to.be.false;
В конце увеличиваем время:
await time.increase(40);
И проверяем, что claim() работаем и деньги переводятся на счет организатора при успешном завершении:
await expect(() => campaignAsOwner.claim()).to.changeEtherBalances([campaignAsOwner, owner], [-1500, 1500]);
В тестах меня всегда немного смущала логика: кому, когда и к чему нужно подключаться. Но когда вот так рассматриваешь контракты и тесты, то все становится понятнее.
Я каждому рекомендую немного посидеть с тестами и попрактиковаться.
#croudfunding #test
Post #343
155
- 👍 1