Написание тестов с 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.
Специальный набор тестов
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)
}
}