Написання тестів за допомогою Blueprint
Огляд
Інструментарій для тестування (зазвичай пісочниця) вже включено до TypeScript SDK під назвою Blueprint. Ви можете створити демонстраційний проект і запустити тест за замовчуванням у два кроки:
- Створіть новий проєкт Blueprint:
 
npm create ton@latest MyProject
- Проведіть тест:
 
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
});
Написання тестів на складне твердження
Основний робочий процес створення тесту виглядає наступним чином:
- Створіть спеціальну обгорнуту сутність 
Contractза допомогоюblockchain.openContract(). - Опишіть дії, які повинен виконати ваш 
Contract, і збережіть результат виконання у зміннійres. - Перевірте властивості за допомогою функції 
expect()та відповідникаtoHaveTransaction(). 
Відповідник toHaveTransaction очікує об'єкт з будь-якою комбінацією полів типу FlatTransaction, визначених з наступними властивостями
| Ім'я | Тип | Опис | 
|---|---|---|
| від | Адреса? | Контрактна адреса відправника повідомлення | 
| на | Адреса | Контрактна адреса призначення повідомлення (Альтернативна назва властивості to). | 
| значення | Біґінт? | Кількість Toncoins у повідомленні в нанотонах | 
| тіло | Cell | Тіло повідомлення визначено як комірка | 
| op | номер? | Код операції - це номер ідентифікатора операції (зазвичай crc32 у TL-B). Очікується у перших 32 бітах тіла повідомлення. | 
| успіх | булевий? | Прапорець користувацької пісочниці, який визначає результуючий статус певної транзакції. True - якщо і обчислення, і фаза дії пройшли успішно. В іншому випадку - False. | 
Ви можете опустити поля, які вас не цікавлять, і передати функції, які приймають типи, що повертають булеві значення ("істина" означає "добре") для перевірки, наприклад, діапазонів чисел, опкодів повідомлень тощо. Зверніть увагу, що якщо поле є необов'язковим (наприклад, 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:
- [Урок 2: Тестування FunC для смарт-контракту] (https://github.com/romanovichim/TonFunClessons_Eng/blob/main/lessons/smartcontract/2lesson/secondlesson.md)
 - [TON Hello World частина 4: Покрокове керівництво для тестування вашого першого смарт-контракту] (https://ton-community.github.io/tutorials/04-testing/)
 - TON Smart Contract Pipeline
 - [[YouTube]Шостий урок FunC & Blueprint. Газ, збори, тести]] (https://youtu.be/3XIpKZ6wNcg)
 
Приклади
Ознайомтеся з наборами тестів, які використовуються для контрактів TON Ecosystem, і навчіться на прикладах.
- випробування в пісочниці з рідинно-контрактним підрядом
 - governance_tests
 - JettonWallet.spec.ts
 - governance_tests
 - MassSender.spec.ts
 - TonForwarder.spec.ts
 - Assurer.spec.ts