Сразу отмечу, что статья не претендует на истину. Это всего лишь мои заметки о том, как вообще можно написать и запустить простые тесты для React
, т.к. тут оказалось много места где заблудиться\окопаться. Итак, начнём.
Babel
Раз React
значит и JSX
, а значит и babel
. Но простой запуск mocha просто запускает nodejs
, в котором никакого JSX
нет (и наверное никогда не будет). Что делать? Поиск подсказывает, что нужно запускать mocha (далее речь идёт именно о mocha) с флагом –compilers js:babel-core/register
. Что сие есть? Это флаг заставит mocha
предварительно компилировать код используя babel-core/register
, который грубо <s>изнасилует</s>подменяет require()
в nodejs
, что позволяет ему предварительно изуродоскомпилировать кодовую базу в нормальный javascript
.
Import\Export и .babelrc
Ок, но как babel
-ю подсказать, что использовать в качестве конфига? Точного внятного ответа пока дать не могу, но как минимум можно создать в корне json-файл
с именем .babelrc
, который будет содержать json-конфиг
. Мне прокатило, но в более сложных ситуациях нужно будет искать вариант поделикатнее. Собственно, чтобы не дублировать конфиг, имеет смысл подключить его и в webpack.config.js
. Сразу отмечу, что взять и распарсить .babelrc
как json простым вызовом require()
nodejs
почему-то не смогла (видимо мешает отсутствие расширения .json
), поэтому fs.readFileSync
и JSON.parse
вам в помощь.
Полифилы, JSDom и прочая нецензурщина
nodeJS
это nodeJS
, а не браузер, а для ряда тестов потребуется имитация браузера. И похоже, что на данный момент изящных решений нет, т.к. кодовая база react-*
грубо сверяется с глобальным наличием window & document
. Мде. Помимо прочего всякие полифилы, вроде regenerator
-а (ну или отключить транспайлинг async-await
в генераторы ещё до этапа компиляции) нужны.
Для решения вопроса с полифилами достаточно import ‘babel-polyfill’
. а вот с JSDom так просто не срастётся. Я воспользовался таким решением:
import ‘jsdom-global/register’;
- принудительно зафиксировал
jsdom
на8-й
версии (а не 10-й)
Замечу, что жизненноважно
подключать этот костыль с JSDom
до подключения React
, иначе груды неадекватных глупых ошибок без внятных описаний украсят вашу безмятежную жизнь. Суть в том, что в недрах разных react-либ
window
кешируется ещё на этапе подключения файлов. И в последствии какой-нибудь флаг вида canUseDom === false
будет вам яростно мешаться.
Можно подключать эти либы в каждом тест-файле, но тогда вы столкнётесь с тем, что при запуске сразу пачки тестов, babel-polifil
будет падать со словами “я уже подключён”, jsdom
тоже будет что-нибудь базлать. Разумная альтернатива вынести обе эти строки в некий setup.js
, а потом его подключать флагом –require tests/setup.js
.
Сами тесты
React
поставляет в пакете react-dom
ряд инструментов для тестирования. Но даже на официальной странице этих инструментов упоминается, что вам стоит воспользоваться некой либой под названием enzyme
. Установка оказалась не совсем тривиальной, т.к. сильно зависит от версии вашего React
-а. Очень внимательно прочитайте инструкции по установке. Заодно доставьте к нему что-нибудь вроде chai
для удобства тестирования.
Отмечу, что enzyme
предоставляет по сути 3 набора утилит для работы с вашими React
компонентами. А именно shallow
для быстрого и поверхностного рендеринга, render
для работы уже с html
, и mount
для полноценной работы с DOM
и life-cycle
React-компонентов. В любых маломальски сложных ситуациях готовьтесь к танцам с бубнами. Например .simulate
метод для вызова событий умеет только React-события
, а повешанные через addEventListener
уже нет. Готовьтесь к нефинормативным ошибкам, куда же без них.
Примеры кода для тестов можно посмотреть здесь. По правде говоря я, на данный момент, не в восторге ни от самой либы, ни от её документации.