Перейти в консоль разработчика и открыть вкладку тестирования. Это актуально для Алисы. Для других платформ ссылка вставляется в соответствующую консоль разработчика.
Не нужно разворачивать сервер для отладки!
Для тестирования используется тот же код, что и для запуска.
С той лишь разницей, что нужно использовать класс BotTest вместо Bot.
import { BotTest } from 'umbot/test';
import { fullPlatforms } from 'umbot/plugins';
const bot = new BotTest();
bot.use(fullPlatforms); // регистрируем платформы — без этого test() не знает, какой формат использовать
await bot.test(); // запускает интерактивную консоль
Запуск будет выглядеть следующим образом:
npm run build && npm run start
# или напрямую собранный файл (стандартный CLI-проект кладёт код в dist/)
node ./dist/index.js
Откроется консоль с Вашим приложением. Для выхода из режима тестирования нужно:
isEnd = true (завершение диалога) — дойдите в сценарии до этого места.BotTest по умолчанию работает с «auto»-платформой: при вызове test() и simulate() без явного указания будет
использована первая зарегистрированная (при fullPlatforms это Алиса). Платформа, переданная в конструктор,
становится приоритетной для test()/simulate() — но сам адаптер всё равно нужно зарегистрировать через bot.use(...).
Отдельная особенность run(): без явного appType он принудительно использует 'alisa', даже если в конструкторе
указана другая платформа, — передавайте appType явно: bot.run('telegram', ...).
import { BotTest } from 'umbot/test';
import { fullPlatforms } from 'umbot/plugins';
// Приоритетная платформа — Telegram
const bot = new BotTest('telegram');
bot.use(fullPlatforms);
import { BotTest } from 'umbot/test';
import { fullPlatforms } from 'umbot/plugins';
// Приоритетная платформа — Алиса
const bot = new BotTest('alisa');
bot.use(fullPlatforms);
Платформу для тестирования нужно зарегистрировать через
bot.use(...)— иначеBotTestне найдёт её адаптер.
Объект IBotTestParams с настройками отображения результатов передаётся в метод test():
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
| isShowResult | boolean | false | Отображать полный ответ платформы в формате JSON |
| isShowStorage | boolean | false | Отображать данные из хранилища (userData и state) |
| isShowTime | boolean | true | Отображать время выполнения запроса в мс |
const bot = new BotTest();
// Расширенное тестирование с отображением всех данных
await bot.test({
isShowResult: true, // Показать JSON-ответ платформы
isShowStorage: true, // Показать данные пользователя и хранилища
isShowTime: true, // Показать время выполнения
});
import { BotTest } from 'umbot/test';
import { TelegramAdapter } from 'umbot/plugins';
const bot = new BotTest('telegram');
bot.use(new TelegramAdapter('your-token'));
bot.setPlatformParams({
intents: [
{
name: 'greeting',
slots: ['привет', 'здравствуйте'],
},
],
});
bot.initBotController(MyController);
await bot.test({
isShowResult: true,
isShowStorage: true,
});
BotTest можно использовать в unit-тестах для проверки логики:
import { BotTest } from 'umbot/test';
import { fullPlatforms } from 'umbot/plugins';
import { MyController } from './MyController';
describe('MyController', () => {
it('should greet user', async () => {
const bot = new BotTest();
bot.use(fullPlatforms); // без зарегистрированной платформы run() бросит ошибку
bot.initBotController(MyController);
// Запуск обработки запроса. Важно: payload должен быть валидным для платформы —
// адаптер проверяет структуру (например, Алиса требует session + request),
// иначе setQueryData() вернёт false и запрос будет отклонён
const result = await bot.run(
'alisa',
JSON.stringify({
version: '1.0',
session: { message_id: 0, user_id: 'test-user' },
request: { command: 'привет', original_utterance: 'Привет' },
}),
);
// Проверка результата — лучше проверять содержимое, а не только факт наличия
expect(result).toBeDefined();
expect(JSON.stringify(result)).toContain('Привет');
});
});
simulate()Вместо ручной сборки JSON-запроса платформы можно использовать simulate() — метод сам сгенерирует корректный payload для указанной платформы и вызовет run():
import { BotTest } from 'umbot/test';
import { AlisaAdapter, T_ALISA } from 'umbot/plugins';
const bot = new BotTest();
bot.use(new AlisaAdapter());
bot.addCommand('start', ['привет'], (_, ctx) => {
ctx.text = 'Привет!';
});
// Голосовая платформа: результатом будет готовый JSON-ответ платформы
const res = (await bot.simulate('привет', { platform: T_ALISA })) as {
response: { text: string };
};
console.log(res.response.text); // 'Привет!'
Для чат-платформ (Telegram, VK, Viber, Max) simulate() включает skipAutoReply, поэтому
реальной отправки сообщения в API платформы не происходит — даже если токен не задан:
import { BotTest } from 'umbot/test';
import { TelegramAdapter, T_TELEGRAM } from 'umbot/plugins';
const bot = new BotTest();
bot.use(new TelegramAdapter('your-token'));
bot.addCommand('start', ['привет'], (_, ctx) => {
ctx.text = 'Привет!';
});
// Для чат-платформ результат — 'ok' (отправка пропущена),
// а текст ответа остаётся в контроллере
await bot.simulate('привет', { platform: T_TELEGRAM });
console.log(bot.getBotController()?.text); // 'Привет!'
Параметры simulate(query, options):
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
query |
string |
— | Текст пользователя |
options.platform |
TAppType |
платформа конструктора или первая зарегистрированная | Платформа, для которой генерируется запрос |
options.userId |
string |
'test_user' |
ID пользователя |
options.count |
number |
0 |
Номер сообщения (0 — новый пользователь/сессия) |
options.state |
object | string |
{} |
Предзаполненное состояние сессии |
Метод возвращает тот же результат, что и run(): для голосовых платформ — JSON-ответ,
для чат-платформ — строку 'ok', так как отправка в API в режиме симуляции пропускается.
Более детальный пример с настройкой платформы и проверкой ответа:
import { BotTest } from 'umbot/test';
import { fullPlatforms, T_ALISA } from 'umbot/plugins';
import { MyController } from '../../src/controller/MyController';
describe('MyController', () => {
let bot: BotTest;
beforeAll(() => {
bot = new BotTest();
bot.use(fullPlatforms);
bot.setAppConfig({ isLocalStorage: true });
bot.setPlatformParams({
welcome_text: 'Привет!',
intents: [{ name: 'help', slots: ['помощь'] }],
});
bot.initBotController(MyController);
});
it('handles welcome', async () => {
const result = await bot.run(
T_ALISA,
JSON.stringify({
version: '1.0',
session: { message_id: 0, user_id: 'test-user' },
request: { command: 'привет', original_utterance: 'Привет' },
}),
);
expect(result).toBeDefined();
});
it('handles help command', async () => {
const result = await bot.run(
T_ALISA,
JSON.stringify({
version: '1.0',
session: { message_id: 1, user_id: 'test-user' },
request: { command: 'помощь', original_utterance: 'Помощь' },
}),
);
expect(result).toBeDefined();
});
});
| Способ | Когда использовать | Что получаете |
|---|---|---|
bot.test() |
Интерактивная отладка в консоли | Диалог в реальном времени, вводите текст руками |
bot.run(appType, content) |
Автоматизированные тесты (Jest) | Программный доступ к результату, можно проверять assertions |
bot.setContent() + bot.run() |
Тестирование с предустановленным контентом | Удобно для повторяющихся тестов |
Рекомендация: используйте bot.run() для Jest-тестов — это даёт полный контроль над входящими данными и возможность проверять результат.
Из режима тестирования можно выйти двумя способами:
exit в консолиthis.isEnd = true, диалог завершится автоматическиВ зависимости от параметров, BotTest выводит:
response.text, для чат-ботов — text)isShowResult: true): полный JSON-ответisShowStorage: true): содержимое userData и stateisShowTime: true): время обработки запроса в миллисекундах