Тестирование частных функций JavaScript с помощью Babel

В JetClosing мы используем декомпозицию и модульное программирование. По мере того, как проекты становятся больше, важно четко определять интерфейс между объектами, экспортируя методы, составляющие этот интерфейс. Иногда это может вызвать проблемы при попытке модульного тестирования этого кода, особенно частных функций. Существующие стратегии для достижения этой цели имеют свои проблемы:

  • Раскрытие частных участников - это создает потенциальные проблемы с безопасностью и может повлиять на разработку; например, когда автоимпорт предлагает предполагаемых частных членов над другими общедоступными.
  • Тестирование с помощью общедоступных функций. Такой подход мучителен! Чтобы иметь целевые тесты для частных функций, требуется связка кода установки и удаления, чтобы гарантировать выполнение частной функции.
  • Использовать существующие сторонние параметры. Текущие параметры ограничены и требуют нескольких плагинов или пользовательского тестового импорта; такие как denude и babel-plugin-test-export.

Ни одна из этих стратегий не является идеальной или практичной для больших проектов, поэтому мы решили создать собственное решение в виде одного плагина Babel: babel-plugin-testable. Как и большинство современных разработчиков JavaScript, мы используем Babel для компиляции современного JavaScript в обратно совместимый код. Поэтому мы создали плагин, который может экспортировать наш код ES6 + для тестирования.

Интеграция плагина

Установить

Установите плагин с помощью вашего любимого менеджера пакетов: npm install -D babel-plugin-testable или yarn add -D babel-plugin-testable.

Давать возможность

Добавьте плагин в конфигурацию Babel:

Использование плагина

А теперь украсьте и импортируйте!

Украсить

Добавьте тестируемые комментарии к коду, который вы хотите протестировать:

Импортировать

Импортируйте своих частных участников вместе с общедоступными в свои тесты и добавьте любой тестовый код, который вам нужен:

Вот и все!

Теперь вы можете импортировать любую частную функцию, переменную или класс для целей тестирования. Просто и чисто!

Нитти Гритти

Итак, как это работает? Это тоже довольно просто!

При компиляции кода плагин отключает переменные среды NODE_ENV или BABEL_ENV, чтобы определить, компилируется ли код для тестов. Если ни один из них не 'test', то он компилируется как обычно. В противном случае он ищет закрытые члены верхнего уровня (переменные, функции и классы), помеченные комментарием // @testable, и добавляет перед ними export. Это позволяет импортировать частные члены в ваши тестовые файлы, как и любой другой экспортированный член.

Дать ему шанс!

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