170 похожих чатов

Предположим, я делаю бота для телеграма. но хочу использовать многослойную

архитектуру.

у меня есть обертка над апи телеги TelegramWrapper, у которой:
* есть функция onCommand(command, handler).
* есть свойство commandEmitter, через который происходит подписка при помощи onCommand. (потом когда из телеги поступают команды, то вызывается commandEmitter.emit(command, payload).

сами обработчики команд находятся в контроллерах, например HelpController, который:
* при запуске вызывает telegram.onCommand('/help', this.handler), в котором уже происходит действо.

вопрос: "а как это тестировать?"

1. делать мок TelegramWrapper, через onCommand получать handler и затем вызывать его вручную. ну, как-то кривовато.

2. контроллеры должны быть простыми: получил данные, вызвал юзекейс с ними, вернул пользователю ответ. тогда юниттесты нужны для юзекейсов, а контроллеры тестируются интеграционными тестами.

3. вместо commandEmitter в TelegramWrapper использовать глобальную шину сообщений. и тогда в тестах можно симулировать события через нее.

второй подход выглядит хорошо. а какие есть недостатки у третьего подхода?

2 ответов

6 просмотров

А ты протестируй что эмиттер и шина в общем-то покрывают все эджкейсы и делай юниты на контроллеры из 2го варианта, мокая базу. Интеграционные тебе будут нужны всё равно, но типо для ошибок уровня экспресса, апи и тд

Если методы отправки ответа юзеру находятся в самом payload (нп payload.send()) то можно мокать только этот payload. Т.е у тебя будет что-то вроде этого. TGWrapper.onCommand('cmd', HelloCtrl); const payload = new Payload({user: id, command: ''}); TGWrapper.emit('cmd', payload); // дождаться пока контроллер работу закончит и отправит ответ через метод который находится в payload assert(payload.response)

Похожие вопросы

Обсуждают сегодня

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
короче сгенерила мне эта штука код на ассемблере: struc string val { common local .value dq .value .value: if ~val eq db val end if db 0 } fo...
Vi Chapmann Chapmann
12
Всем привет! Массив вводится с клавиатуры, кол-во элементов неизвестно, поэтому я указал arr db 100 dup(?) С нахождением максимума проблем нет, а вот минимум почему-то всегд...
En Vind Av Sorg
11
#include <stdio.h> int main(void) { int n; scanf("%d", &n); int digits1[n] = {0}; int digits2[n] = {0}; я не могу таким образом заранее массив нулями заполнить?
Linus
12
в сях есть множество как в питоне? для удаление дубликатов
Linus
25
я про форму записи. смысл указывать что 8 байтный регистр 8 байт?
Aiwan \ (•◡•) / _bot
10
читать файл максимально быстро? странный вопрос))
zamtmn
53
Вроде бы вопрос уже заезжанный, но тем не менее У меня есть функция menu() которая выводит набор возможных действий, а затем спрашивает у пользователя что он хотел бы сделать....
David Golovatin
3
Кто создает тут ботов для телеграмм групп ?
Antskup
8
а как бы вылезти из ИО, что то типа IO -> Ether или в какую сторону смотреть ? что то туплю
Fedor
14
Карта сайта