Если вы читаете это, вы, вероятно, уже знакомы с программой TDD. Напишите тесты, которые не проходят, напишите код, который прошел тест, выполните рефакторинг (при необходимости), повторите.

Если вы похожи на меня, то как только вы попытаетесь применить это в своем следующем проекте, вы окажетесь в тупике. Многие учебные пособия, как правило, объясняют эту концепцию, с коротким примером, включающим функцию умножения и деления с модульными тестами. Но наши проекты имеют тенденцию становиться немного сложнее, не так ли?

К счастью, мне удалось проделать свой путь, и я решил написать это руководство, чтобы помочь другим применить TDD к большему количеству реальных приложений.

Сегодня мы будем создавать бота для Discord, применяя концепции TDD, используя Jest (наш фреймворк для тестирования), Discord.js (библиотека для создания ботов Discord), youtube-dl (для захвата видео с YouTube, подробнее об этом позже) и прикосновение к Вавилону, чтобы получить эти приятные функции ES6.

К концу этой серии руководств у нас будет бот, который сможет выполнять такие команды, как

!play https://www.youtube.com/watch?v=w2Ov5jzm3j8

И присоединитесь к голосовому каналу пользователя, чтобы транслировать аудио из видео YouTube в голосовой чат. Звучит достаточно сложно, чтобы запачкать TDD, но в то же время достаточно просто, чтобы все заработало быстро!

Настройка

Сначала мы создадим новый проект Node.js и установим наши зависимости. Создайте новую папку и выполните следующие команды

# Initialize new node project
npm init
# Install testing and babel dependencies. 
# --save-dev for these as they're used only for development
npm install --save-dev jest @types/jest @babel/core @babel/plugin-transform-runtime @babel/preset-env @babel/runtime
#Install application dependencies
npm install --save youtube-dl discord.js

Теперь мы настроим файл .babelrc в корне нашего проекта, чтобы получить упомянутые нами функции ES6.

Затем нам нужно настроить наш package.json и добавить тестовый сценарий, чтобы легко запускать jest.

Наконец, мы создадим 2 папки. Папка test и папка src. Один для проведения наших тестов, а другой для хранения нашего фактического кода.

Вот и все! К концу настройки структура вашего проекта должна выглядеть примерно так.

Наш первый тест, пинг-понг

Мы начнем с малого, чтобы намочить ноги. Давайте дадим нашему боту команду ! Ping. Когда бот видит сообщение ! Ping, мы просто отправляем pong.

Следуя TDD, мы должны сначала провести неудачный тест, чтобы начать работу. Вот первый тест, который я написал:

Может показаться, что это много, так что давайте разберемся.

Что касается нашего проекта, в настоящее время нужно помнить о трех вещах:

  1. У нас будет бот MusicBot, который будет обрабатывать команды
  2. У нас будут команды, отправленные через сообщения Message, которые наш бот должен будет обработать / обработать
  3. Сообщения будут приходить из чата ChatRoom. В этой чат-комнате есть довольно простые функции: отправка сообщений sendMessage и голосовой чат (подробнее об этом скоро).

Для нашего проекта мы также хотим, чтобы наши тесты были быстрыми, поэтому мы имитируем собственный ChatRoom, чтобы мы могли отслеживать, как бот с ним взаимодействует.

Успешное прохождение теста

Давайте быстро проведем наш тест:

npm test

Вы должны увидеть гигантский результат FAIL из-за того, что не нашли наши модули. Идеально! Давай пройдем этот тест.

Давайте сначала разберемся с этими проблемами импорта. Давайте создадим отсутствующие файлы src, которые мы пытаемся импортировать, ChatRoom.js, Message.js и MusicBot.js.

Давайте добавим этим новым файлам экспорт по умолчанию. Мы просто создадим для каждого пустой класс с конструктором для нашего Message класса:

Давайте снова запустим нашу тестовую команду.

Звучит довольно просто, наш MusicBot - просто пустой класс. Давай заполним его туз этой присоски! Все, что нам нужно сделать, это отправить ответ «понг» через чат.

Запустите npm test, и мы должны увидеть красивый зеленый результат «ПРОЙДЕН».

Больше тестов!

Надеюсь, вы немного обеспокоены нашей реализацией. Наш «обработчик сообщений» просто каждый раз отправляет понг. У вас может возникнуть соблазн зайти и изменить файл MusicBot.js так, чтобы он содержал оператор if, но вы нарушите правила TDD. Вы должны писать код, чтобы пройти тест.

Так что же нам делать? Напишите еще один тест! Напишем случай, когда наш бот НЕ должен отправлять ответ. Давайте добавим следующий код под первый написанный нами тест.

Запустите наши тесты, и ох!

Давайте изменим наш код MusicBot.js, чтобы это исправить.

Теперь давайте посмотрим на результаты наших тестов.

Хороший!

Вывод

"Ого, неужели не должно быть больше?" вы можете подумать. Оказывается, написание руководств может занять довольно много времени и быстро стать долгим! Я скоро сделаю часть 2, где мы подключим это к настоящему боту Discord и увидим его в действии!

Давайте рассмотрим, что мы уже сделали. Нам удалось написать абстрактного бота, который может принимать сообщения и отвечать соответственно. Большой упор на абстрактное, так как вы, возможно, заметили, что у нас еще нет действующего бота Discord.

Это хорошая вещь! На данный момент мы должны сосредоточиться на основной логике нашего бота. Это не только упростит работу, но и упростит обслуживание и обновление без использования внешних API, таких как Discord.

Это первое руководство, которое я написал за долгое время. Пожалуйста, дайте мне знать, что вы думаете. Это было слишком долго? Следует ли разрезать или расширить некоторые разделы? Это действительно помогло !? Хотелось бы знать, что вы думаете! ❤