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

Написание тестов с Blueprint

warning

Эта страница переведена сообществом на русский язык, но нуждается в улучшениях. Если вы хотите принять участие в переводе свяжитесь с @alexgton.

Общие сведения

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

  1. Создайте новый проект Blueprint:
npm create ton@latest MyProject
  1. Запустите тест:
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
});

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

Базовый рабочий процесс создания теста:

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

Средство сопоставления toHaveTransaction ожидает объект с любой комбинацией полей из типа FlatTransaction, определенного со следующими свойствами

ИмяТипОписание
fromAddress?Адрес контракта отправителя сообщения
onAddressАдрес контракта получателя сообщения (альтернативное имя свойства to).
valuebigint?Количество Toncoin в сообщении в nanoton
bodyCellТело сообщения определено как Cell
opnumber?Op code — это номер идентификатора операции (обычно crc32 из TL-B). Ожидается в первых 32 битах тела сообщения.
successboolean?Пользовательский флаг Sandbox, определяющий конечный статус определенной транзакции. True — если и фаза вычисления, и фаза действия выполнены успешно. В противном случае — False.

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

подсказка

Вы можете узнать весь список полей сопоставления из документации Sandbox.

Специальный набор тестов

Extract SendMode

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

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

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

const actions = loadOutList(Cell.fromBase64(re.result.actions).beginParse());
for (const act of actions) {
if (act.type === "sendMsg") {
// process action
console.log(act.mode)
}
}

Руководства

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

Примеры

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

См. также