Примеры написания тестов
Эта страница переведена сообществом на русский язык, но нуждается в улучшениях. Если вы хотите принять участие в переводе свяжитесь с @alexgton.
На этой странице показано, как писать тесты для контрактов FunC, созданных в Blueprint SDK (Sandbox).
Наборы тестов созданы для демо-контракта fireworks. Fireworks - это смарт-контракт, который изначально запускается через сообщение set_first
.
После создания нового проекта FunC с помощью npm create ton@latest
, в директории проекта будет автоматически сгенерирован тестовый файл tests/contract.spec.ts
для тестирования контракта:
import ...
describe('Fireworks', () => {
...
expect(deployResult.transactions).toHaveTransaction({
...
});
});
it('should deploy', async () => {
// the check is done inside beforeEach
// blockchain and fireworks are ready to use
});
Тесты запускаются с помощью следующей команды:
npx blueprint test
Дополнительные опции и vmLogs могут быть указаны с помощью blockchain.verbosity
:
blockchain.verbosity = {
...blockchain.verbosity,
blockchainLogs: true,
vmLogs: 'vm_logs_full',
debugLogs: true,
print: false,
}
Прямые модульные тесты
Fireworks демонстрирует различные операции с отправкой сообщений в блокчейне TON.
После развертывания с сообщением set_first
с достаточной суммой TON, он будет автоматически запущен с основными и пригодными для использования комбинациями режимов отправки.
Fireworks переразвернулся, в результате чего будет создано 3 сущности Fireworks, каждая из которых имеет свой ID(держите его в хранилище) и, как следствие, свой адрес смарт-контракта.
Для наглядности определите разные по ID экземпляры Fireworks (разные state_init
) со следующими именами:
- 1 - Fireworks setter - сущность, которая распределяет различные опкоды запуска. Может быть расширено до четырех различных опкодов.
- 2 - Fireworks launcher-1 - экземпляр Fireworks, который запускает первый fireworks, что означает, что сообщения будут отправляться на launcher.
- 3 - Fireworks launcher-2 - экземпляр Fireworks, который запускает второй fireworks, что означает, что сообщения будут отправляться из launcher.
Развернуть детали транзакций
index - ID транзакции в массиве launchResult
.
0
- Внешний запрос к казне (Launcher), который привел к исходящему сообщениюop::set_first
с 2.5 до fireworks1
- Транзакция в контракте Fireworks setter вызвана с по мощьюop::set_first
и выполнена с двумя исходящими сообщениями для Fireworks Launcher-1 и Fireworks Launcher-22
- Транзакция в Fireworks launcher 1 вызвана с помощьюop::launch_first
, и выполнена с четырьмя исходящими сообщениями в Launcher.3
- Транзакция в Fireworks launcher 2 вызвана с помощьюop::launch_second
и выполнена с исходящим сообщением для Launcher.4
- Транзакция в Launcher с входящим сообщением от Fireworks launcher 1. Это сообщение отправлено сsend mode = 0
.5
- Транзакция в Launcher с входящим сообщением от Fireworks launcher 1. Это сообщение отправлено сsend mode = 1
.6
- Транзакция в Launcher с входящим сообщением от Fireworks launcher 1. Это сообщение отправлено сsend mode = 2
.7
- Транзакция в Launcher с входящим сообщением от Fireworks launcher 1. Это сообщение отправлено сsend mode = 128 + 32
.8
- Транзакция в Launcher с входящим сообщением от Fireworks launcher 2. Это сообщение отправлено сsend mode = 64
.
Каждый "firework" - исходящее сообщение с уникальным телом сообщения - появляется в транзакциях с ID:3 и ID:4.
Ниже приведен список тестов для каждой транзакции, ожидаемой как успешно выполненная. Транзакция[ID:0] Внешний запрос к казне (Launcher), завершившийся исходящим сообщением op::set_first
с 2.5 к Fireworks. В случае, если Вы развернете Fireworks на блокчейне, fireworks - это Ваш кошелек.
Транзакция ID:1 Успешный тест
Этот тест проверяет, успешно ли установлен firework, отправляя транзакцию со значением 2.5 TON. Это простейший случай, основная цель здесь - утвердить результат свойства success транзакции в true.
Чтобы отфильтровать определенную транзакцию из массива launhcResult.transactions
, мы можем использовать наиболее убедительные поля.
С помощью
from
(адрес отправителя контракта), to
(адрес получателя контракта), op
(значение опкода) - мы получим только одну транзакцию для этой комбинации.
Транзакция [ID:1] в контракте Fireworks Setter, вызвана через op::set_first
и выполнена с двумя исходящими сообщениями к Fireworks launcher-1 и Fireworks launcher-2
it('first transaction[ID:1] should set fireworks successfully', async () => {
const launcher = await blockchain.treasury('launcher');
const launchResult = await fireworks.sendDeployLaunch(launcher.getSender(), toNano('2.5'));
expect(launchResult.transactions).toHaveTransaction({
from: launcher.address,
to: fireworks.address,
success: true,
op: Opcodes.set_first
})
});
Транзакция ID:2 Успешный тест
Этот тест проверяет, успешно ли выполнена транзакция[ID:2].
Транзакция в Fireworks launcher 1 вызвана через op::launch_first
, и выполняется четырьмя исходящими сообщениями в Launcher.
it('should exist a transaction[ID:2] which launch first fireworks successfully', async () => {
const launcher = await blockchain.treasury('launcher');
const launchResult = await fireworks.sendDeployLaunch(launcher.getSender(), toNano('2.5'));
expect(launchResult.transactions).toHaveTransaction({
from: fireworks.address,
to: launched_f1.address,
success: true,
op: Opcodes.launch_first,
outMessagesCount: 4,
destroyed: true,
endStatus: "non-existing",
})
printTransactionFees(launchResult.transactions);
});
В случаях, когда транзакция должна повлиять на состояние контракта, это можно указать с помощью полей destroyed
, endStatus
.
Полный список полей, связанных со статусом аккаунта:
destroyed
-true
- если существующий контракт был уничтожен в результате выполнения определенной транзакции. В противном случае -false
.deploy
- флаг песочницы, указывающий, был ли контракт развернут во время этой транзакции.true
, если контракт до этой транзакции не был инициализирован, а после этой транзакции стал инициализированным. В противном случае -false
.oldStatus
- статус аккаунта до выполнения транзакции. Значения:uninitialized
,frozen
,active
,non-existing
.endStatus
- статус аккаунта после выполнения транзакции. Значения:uninitialized
,frozen
,active
,non-existing
.