Тестирование приложений React, использующих глобальное состояние Reactn
У нас, в Турбосис, мы давно использовали редукс. Мы никогда не чувствовали себя слишком комфортно с этим, я имею в виду, это довольно надежное решение, хорошо документированное и стабильное, но кривая обучения для менее опытных членов команды - плохая.
Кроме того, иногда кажется, что это может быть проще. Все его шаблоны утомительны: редактировать и тестировать компоненты, которые запускают создателя действий, которые должны быть протестированы, которые запускают действия для редуктора, которые должны быть протестированы ... Слишком много обезьяньего бизнеса :)
Так были выпущены перехватчики React и Charles Stover выпустил Reactn. По его словам: расширение React, которое включает глобальное управление состоянием.
Мы попробовали и получили удовольствие. Не буду вдаваться в подробности, полагаю, вы уже знаете, и он тоже понравился! Я выскажу некоторые мысли о том, как тестировать приложения, написанные с использованием глобального состояния Reactn.
Тестирование использования Reactn Global Hook
В документации Reactn представлен пример компонента Cards, и я тоже буду его использовать. С некоторыми незначительными изменениями это выглядит примерно так:
Мы берем наши карты из глобального состояния (через useGlobal) и отправляем их на отображение компонента Card.
При тестировании компонентов с использованием redux мы обычно создаем имитируемое хранилище с помощью rosie и передаем его нашему компоненту как props:
Используя reactn, мы делаем это немного иначе. Нам нужно смоделировать функцию useGlobal:
Мы высмеяли реакцию и установили для возвращаемого значения useGlobal известный сценарий, который будет передавать состояние в компоненте. В этом примере я решил сделать снимок своего компонента Cards:
Я вообще не буду беспокоиться о том, чтобы вызывалась useGlobal. Для уверенности достаточно самого вывода или любых ожиданий от содержания.
Тестирование функции установки
Таким же образом мы можем протестировать функцию установки. Предположим, у нас есть кнопка для запроса новой карты (я имею в виду игру в блэкджек). Для удобства я сохраню эту кнопку в уже знакомом нам компоненте:
В этом примере, помимо карточек, у нас также есть кнопка для получения случайной карточки. Я абстрагирую способ получения этой случайной карты, я мог бы сделать это в компоненте, если бы захотел, но я хочу, чтобы этот пример был более чистым.
Функция getRandomCard может получить список карточек и выбрать новые карточки, отличные от тех, что у меня в руке (но, возможно, вы захотите написать функцию-редуктор в этом случае).
Чтобы протестировать эту новую версию нашего образца, я сделал:
Этот подход можно использовать и с обещаниями. Все, что вам нужно сделать, это использовать методы mockResolvedValueOnce или mockRejectedValueOnce из функции jest mock.
Вы можете создать папку __mocks__ рядом с node_modules и внутри нее создать файл responsen.js следующим образом:
Таким образом, вы можете избежать имитации useGlobal в каждом тесте, jest может автоматически имитировать его для вас. Даже при этом моя питоническая сторона заставляет меня в любом случае предпочитать явно имитировать модуль в тестовом файле (явное лучше, чем неявное).
Такой же подход работает и с вариантами хуков:
Вот и все! Теперь мы можем легко проверить наше глобальное состояние!
Спасибо за прочтение. Любые комментарии приветствуются;)