TGViewer
Из Solidity в AI и дальше Из Solidity в AI и дальше @solidityset · 2.47K subscribers
Post #343 155
Разбор тестов краудфандинга. Часть 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
  • 👍 1
More from @solidityset
  1. Oct 15, 2026Немного новостей про Core Solidity Команда Solidity опубликовала обновление о разработке C…
  2. Oct 8, 2026Промо видео для SaaS и других ваших проектов Хочу поделить с вами одним из своих открытий…
  3. Oct 8, 2026video post
  4. Oct 2, 2026Вторая сложность — как доказать, что установилось именно опубликованное. В первом варианте…
  5. Oct 2, 2026Задача с полуоткрытым кодом На днях, в процессе создания одного приложения, столкнулся с и…
  6. Sep 22, 2026Какой язык программирования учить сейчас? На днях в Твиттере увидел небольшой пост о разви…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →