Вызов метода получения
Нам нужно будет создать еще один метод в оболочке нашего контракта, а именно — метод getData , который будет запускать метод получения нашего контракта и возвращать результаты, которые мы имеем в хранилище c4.
Вот как будет выглядеть наш метод получения:
async getData(provider: ContractProvider) {
const { stack } = await provider.get("get_the_latest_sender", []);
return {
recent_sender: stack.readAddress(),
};
}
Как и в нашем случае с отправкой внутреннего сообщения — мы используем провайдера и его методы. В данном случае мы используем метод get . Затем мы читаем адрес из полученного stack и в результате возвращаем его.
Написание тестов
Вот и все. Мы выполнили всю подготовительную работу и теперь напишем собственно тестовую логику. Вот как будет выглядеть наш тестовый сценарий:
1. Отправляем и внутреннее сообщение
2. Мы гарантируем, что отправка прошла успешно
3. Мы вызываем метод получения контракта и проверяем, что вызов прошел успешно.
4. Мы сравниваем результаты, полученные от метода получения, с адресом from , который мы установили в исходном внутреннем сообщении.
Кажется довольно простым и выполнимым! Давай сделаем это.
Команда Sandbox предоставила нам еще одну замечательную утилиту для тестирования. Мы можем установить дополнительный пакет @ton-community/test-utils, запустив yarn add @ton-community/test-utils -D
Это позволит нам использовать .toHaveTransaction для средства сопоставления jest, чтобы добавить дополнительных помощников для упрощения тестирования. Нам также нужно будет импортировать этот пакет в наш test/main.spec.ts после установки.
Давайте посмотрим, как выглядит наш тестовый код, основанный на описанном выше сценарии.
import { Cell, toNano } from "ton-core";
import { hex } from "../build/main.compiled.json";
import { Blockchain } from "@ton-community/sandbox";
import { MainContract } from "../wrappers/MainContract";
import "@ton-community/test-utils";
describe("main.fc contract tests", () => {
it("should get the proper most recent sender address", async () => {
const blockchain = await Blockchain.create();
const codeCell = Cell.fromBoc(Buffer.from(hex, "hex"))[0];
const myContract = blockchain.openContract(
await MainContract.createFromConfig({}, codeCell)
);
const senderWallet = await blockchain.treasury("sender");
const sentMessageResult = await myContract.sendInternalMessage(
senderWallet.getSender(),
toNano("0.05")
);
expect(sentMessageResult.transactions).toHaveTransaction({
from: senderWallet.address,
to: myContract.address,
success: true,
});
const data = await myContract.getData();
expect(data.recent_sender.toString()).toBe(senderWallet.address.toString());
});
});
Мы используем функциональность Jest, чтобы убедиться, что:
- отправка внутреннего сообщения прошла успешно
- метод получения прошел успешно
- метод получения возвращает некоторый результат
- адрес, возвращаемый методом получения, равен тому, который мы использовали в нашем сообщении, устанавливая адрес отправителя
Мы также переименовали «наш первый тест» в «должен получить правильный последний адрес отправителя», мы хотим, чтобы имена наших тестов всегда были читабельными.
Запуск тестов
Вуаля! Мы готовы провести наши тесты. Просто запустите нашу команду yarn testв терминале, и если вы все сделали вместе со мной, вы получите аналогичный результат:
PASS tests/main.spec.ts
main.fc contract tests
✓ should get the proper most recent sender address (444 ms)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 4.13 s, estimated 5 s
И последнее, что мы хотим сделать, это убедиться, что каждый раз, когда мы запускаем тесты, мы также запускаем наш сценарий компилятора. Это полезно для эффективности нашей работы. Большая часть работы по разработке заключается в написании функционального кода и последующем запуске тестов. Давайте упростим это:
Обновите файл package.json , чтобы он выглядел следующим образом:
Нам нужно будет создать еще один метод в оболочке нашего контракта, а именно — метод getData , который будет запускать метод получения нашего контракта и возвращать результаты, которые мы имеем в хранилище c4.
Вот как будет выглядеть наш метод получения:
async getData(provider: ContractProvider) {
const { stack } = await provider.get("get_the_latest_sender", []);
return {
recent_sender: stack.readAddress(),
};
}
Как и в нашем случае с отправкой внутреннего сообщения — мы используем провайдера и его методы. В данном случае мы используем метод get . Затем мы читаем адрес из полученного stack и в результате возвращаем его.
Написание тестов
Вот и все. Мы выполнили всю подготовительную работу и теперь напишем собственно тестовую логику. Вот как будет выглядеть наш тестовый сценарий:
1. Отправляем и внутреннее сообщение
2. Мы гарантируем, что отправка прошла успешно
3. Мы вызываем метод получения контракта и проверяем, что вызов прошел успешно.
4. Мы сравниваем результаты, полученные от метода получения, с адресом from , который мы установили в исходном внутреннем сообщении.
Кажется довольно простым и выполнимым! Давай сделаем это.
Команда Sandbox предоставила нам еще одну замечательную утилиту для тестирования. Мы можем установить дополнительный пакет @ton-community/test-utils, запустив yarn add @ton-community/test-utils -D
Это позволит нам использовать .toHaveTransaction для средства сопоставления jest, чтобы добавить дополнительных помощников для упрощения тестирования. Нам также нужно будет импортировать этот пакет в наш test/main.spec.ts после установки.
Давайте посмотрим, как выглядит наш тестовый код, основанный на описанном выше сценарии.
import { Cell, toNano } from "ton-core";
import { hex } from "../build/main.compiled.json";
import { Blockchain } from "@ton-community/sandbox";
import { MainContract } from "../wrappers/MainContract";
import "@ton-community/test-utils";
describe("main.fc contract tests", () => {
it("should get the proper most recent sender address", async () => {
const blockchain = await Blockchain.create();
const codeCell = Cell.fromBoc(Buffer.from(hex, "hex"))[0];
const myContract = blockchain.openContract(
await MainContract.createFromConfig({}, codeCell)
);
const senderWallet = await blockchain.treasury("sender");
const sentMessageResult = await myContract.sendInternalMessage(
senderWallet.getSender(),
toNano("0.05")
);
expect(sentMessageResult.transactions).toHaveTransaction({
from: senderWallet.address,
to: myContract.address,
success: true,
});
const data = await myContract.getData();
expect(data.recent_sender.toString()).toBe(senderWallet.address.toString());
});
});
Мы используем функциональность Jest, чтобы убедиться, что:
- отправка внутреннего сообщения прошла успешно
- метод получения прошел успешно
- метод получения возвращает некоторый результат
- адрес, возвращаемый методом получения, равен тому, который мы использовали в нашем сообщении, устанавливая адрес отправителя
Мы также переименовали «наш первый тест» в «должен получить правильный последний адрес отправителя», мы хотим, чтобы имена наших тестов всегда были читабельными.
Запуск тестов
Вуаля! Мы готовы провести наши тесты. Просто запустите нашу команду yarn testв терминале, и если вы все сделали вместе со мной, вы получите аналогичный результат:
PASS tests/main.spec.ts
main.fc contract tests
✓ should get the proper most recent sender address (444 ms)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 4.13 s, estimated 5 s
И последнее, что мы хотим сделать, это убедиться, что каждый раз, когда мы запускаем тесты, мы также запускаем наш сценарий компилятора. Это полезно для эффективности нашей работы. Большая часть работы по разработке заключается в написании функционального кода и последующем запуске тестов. Давайте упростим это:
Обновите файл package.json , чтобы он выглядел следующим образом:
{
... our previous package.json keys
"scripts": {
... previous scripts keys
"test": "yarn compile && yarn jest"
}
}
На следующем уроке мы собираемся построить наш конвейер развертывания и узнать, как протестировать реальный контракт развертывания в сети.
... our previous package.json keys
"scripts": {
... previous scripts keys
"test": "yarn compile && yarn jest"
}
}
На следующем уроке мы собираемся построить наш конвейер развертывания и узнать, как протестировать реальный контракт развертывания в сети.
3.5 Развертывание смарт-контракта.pdf
490.4 KB
📚Конспекты лекций на русском
3.5 Развертывание смарт-контракта
3.5 Развертывание смарт-контракта
👎3👍1
3_6_Гибкое_развертывание_из_тестовой_сети_в_основную.pdf
155.4 KB
📚Конспекты лекций на Русском
3.6 Гибкое развертывание из тестовой сети в основную
3.6 Гибкое развертывание из тестовой сети в основную
3_4_Рабочий_процесс_тестирования_и_написание_тестов.pdf
456.5 KB
📚Конспекты лекций
3.4 Рабочий процесс тестирования и написание тестов
3.4 Рабочий процесс тестирования и написание тестов
3_3_Написание_простого_функционального_контракта.pdf
218.2 KB
📚Конспекты лекций
3.3 Написание простого функционального контракта
3.3 Написание простого функционального контракта
3_2_Настройка_рабочего_процесса_компиляции.pdf
270.6 KB
📚Конспекты лекций
3.2 Настройка рабочего процесса компиляции
3.2 Настройка рабочего процесса компиляции
3_1_Обзор_жизненного_цикла_разработки_смарт_контрактов.pdf
213 KB
📚Конспекты лекций
3.1 Обзор жизненного цикла разработки смарт-контрактов
3.1 Обзор жизненного цикла разработки смарт-контрактов
4.1 контракт со встречной логикой_.pdf
175.4 KB
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
4_2_тесты_для_встречного_контракта.pdf
211.1 KB
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
4_3_Контракт_с_логикой_вводавывода_средств.pdf
331.7 KB
Please open Telegram to view this post
VIEW IN TELEGRAM
👎2
4_4_Тесты_на_логику_пополнения_вывода_средств.pdf
256.5 KB
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
4_5_использование_Blueprint_для_развертывания_контрактов_.pdf
267.5 KB
Please open Telegram to view this post
VIEW IN TELEGRAM
👎1
4_6_проверка_исходного_кода_контракта_контрактов_.pdf
400.7 KB
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Please open Telegram to view this post
VIEW IN TELEGRAM