Перейти к основному содержимому

Написание тестов с помощью Blueprint

Обзор

Инструментарий для тестирования (обычно это песочница) уже включен в TypeScript SDK под названием Blueprint. Вы можете создать демо-проект и запустить тест по умолчанию в два этапа:

  1. Создайте новый проект Blueprint:
npm create ton@latest MyProject
  1. Проведите тест:
cd MyProject
npx blueprint test

В результате Вы увидите соответствующий вывод в окне терминала:

% npx blueprint test

> MyProject@0.0.1 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
});

Написание тестов для сложных утверждений

Основная схема создания теста такова:

  1. Создайте определенную обернутую сущность Contract с помощью функции blockchain.openContract().
  2. Опишите действия, которые должен выполнить Ваш контракт, и сохраните результат выполнения в переменной res.
  3. Проверьте свойства с помощью функции expect() и матчера toHaveTransaction().

Матчер toHaveTransaction ожидает объект с любой комбинацией полей из типа FlatTransaction, определенных со следующими свойствами

ИмяТипОписание
с сайтаАдрес?Контрактный адрес отправителя сообщения
наАдресКонтрактный адрес назначения сообщения (альтернативное имя свойства to).
значениеbigint?Количество Тонкоинов в сообщении в нанотонах
телоКлеткаТело сообщения определяется как ячейка
opчисло?Код операции - это номер идентификатора операции (обычно crc32 из TL-B). Ожидается в первых 32 битах тела сообщения.
успехбулево?Пользовательский флаг песочницы, определяющий результирующий статус определенной транзакции. True - если фаза вычислений и действий прошла успешно. В противном случае - False.

Вы можете опустить поля, которые Вас не интересуют, и передать функции, принимающие типы, возвращающие булевы (true означает "хорошо"), для проверки, например, диапазонов чисел, опкодов сообщений и т.д. Обратите внимание, что если поле является необязательным (например, from?: Address), то функция должна принимать и необязательный тип.

подсказка

Весь список полей матчера Вы можете узнать из Документации по песочнице.

Конкретный набор тестов

Извлечение SendMode

Чтобы извлечь режим отправки отправленного сообщения, Вы можете использовать следующий код:


const smc = await blockchain.getContract(addr);

const re = blockchain.executor.runTransaction({
config: blockchain.configBase64, libs: null, verbosity: 'full',
now: Math. floor (Date.now) / 1000),
lt: BigInt(Date.now()),
randomSeed: null,
ignoreChksig: false,
debugEnabled: true,
shardAccount: beginCell()
.store (storeShardAccount (smc.account))
.endCell()
.toBoc()
.toString('base64'),
message: beginCell()
.store (storeMessageRelaxed (...))
.endCell(),
});

if (!re.result. success || !re.result.actions) {
throw new Error('fail');

const actions = loadoutList(Cell.fromBase64(re.result.actions).beginParse());
actions[0].type === 'sendMsg' && actions[0].mode;

Учебники

Узнайте больше о тестировании из самых ценных уроков сообщества на TON:

Примеры

Проверьте тестовые наборы, используемые для контрактов экосистемы TON, и учитесь на примерах.

См. также