Написание тестов с Blueprint
Эта страница переведена сообществом на русский язык, но нуждается в улучшениях. Если вы хотите принять участие в переводе свяжитесь с @alexgton.
Общие сведения
Набор инструментов для тестирования (обычно песочница) уже включен в TypeScript SDK с именем Blueprint. Вы можете создать демонстрационный проект и запустить тест по умолчанию, выполнив два шага:
- Создайте новый проект Blueprint:
npm create ton@latest MyProject
- Запустите тест:
cd MyProject
npx blueprint test
В результате вы увидите соответствующий вывод в окне терминала:
% npx blueprint test
> [email protected] test
> jest
PASS tests/Main.spec.ts
Main
✓ should deploy (127 ms)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 1.224 s, estimated 2 s
Ran all test suites.
Основное использование
Тестирование смарт-контрактов позволяет обеспечить безопасность, оптимизировать расход газа и исследовать крайние случаи. Написание тестов в Blueprint (на основе Sandbox) выполняется путем определения произвольных действий с контрактом и сравнения результатов тестирования с ожидаемым результатом, например:
it('should execute with success', async () => { // description of the test case
const res = await main.sendMessage(sender.getSender(), toNano('0.05')); // performing an action with contract main and saving result in res
expect(res.transactions).toHaveTransaction({ // configure the expected result with expect() function
from: main.address, // set expected sender for transaction we want to test matcher properties from
success: true // set the desirable result using matcher property success
});
printTransactionFees(res.transactions); // print table with details on spent fees
});
Написание тестов для сложных утверждений
Базовый рабочий процесс создания теста:
- Создайте определенную обернутую сущность
Contract
с помощьюblockchain.openContract()
. - Опишите действия, которые должен выполнять ваш
Contract
, и сохраните результат выполнения в переменнойres
. - Проверьте свойства с помощью функции
expect()
и средства сопоставленияtoHaveTransaction()
.
Средство сопоставления toHaveTransaction
ожидает объект с любой комбинацией полей из типа FlatTransaction
, определенного со следующими свойствами
Имя | Тип | Описание |
---|---|---|
from | Address? | Адрес контракта отправителя сообщения |
on | Address | Адрес контракта получателя сообщения (альтернативное имя свойства to ). |
value | bigint? | Количество Toncoin в сообщении в nanoton |
body | Cell | Тело сообщения определено как Cell |
op | number? | Op code — это номер идентификатора операции (обычно crc32 из TL-B). Ожидается в первых 32 битах тела сообщения. |
success | boolean? | Пользовательский флаг Sandbox, определяющий конечный статус определенной транзакции. True — если и фаза вычисления, и фаза действия выполнены успешно. В противном случае — False. |
Вы можете опустить поля, которые вас не интересуют, и передать функции, принимающие типы, возвращающие логические значения (true
означает хор ошо), чтобы проверить, например, диапазоны чисел, коды операций сообщения и т. д. Обратите внимание, что если поле является необязательным (например, from?: Address
), то функция также должна принимать необязательный тип.
Вы можете узнать весь список полей сопоставления из документации Sandbox.