Михал Барановски
Следуя принципам Тестовое развитие (TDD) при написании интерфейса Action App может показаться сложнее, чем делать то же самое на заднем дне.
Во-первых, нам нужно как-то оказывать Наш компонент. Тогда нам нужно Симулировать взаимодействие пользователя с браузером. Далее мы отвечаем на изменения в реквизит и Государство, И, наконец, придумайте способ проверить асинхронный Методы, вызванные нажатием кнопки.
Попытка покрыть все эти случаи в наших тестах, часто приводит к тестам, которые трудно прочитать. Они также часто зависят друг от друга. Мы многомут много, и взамен у нас есть тесты, полные антиблокировки.
Не тратьте свое время
Из того, что я видел, многие программисты создают рабочие компоненты реагирования первыми. Затем они пытаются покрыть их тестами, просто чтобы понять, что компоненты не могут быть проверены в их текущей реализации. Тогда им нужно рефакторировать. Из-за этого они теряют терпение, время и деньги их работодателя.
Доступные решения
К счастью для нас, есть много библиотек тестирования, которые могут помочь нам решить эти проблемы. Мы можем попробовать рендеринг компонентов React с Фермент и отметки Mock API, используя Mockaxios Отказ Однако эти библиотеки обычно имеют столько методов и вариантов, которые могут быть запутаны, особенно для людей, которые только что начали писать тесты.
Давайте возьмем Фермент Например – в чем разница между Мелкий , Гора а также Оказывать методы? И что следует использовать? Это не то, о чем вы должны беспокоиться о том, когда пишете свои тесты, на мой взгляд. Это должно быть как можно лучше.
Наш проект
Для наших быстрых направляющих мы собираемся создать небольшое приложение для реагирования. После нажатия на кнопку случайная шутка о Чак Норрис будет вынесено и отображено.
Так что давайте начнем.
Откиньте, создавая проект реагирования в CodeSandbox , а затем установить следующие зависимости (j est уже предварительно установлен, если вы начали по ссылке выше):
- Axios – используется для получения данных с внешнего API
- Axios-Mock-Adapter – используется для издевающихся ответов сервера
- Реагистрационная тестирование-библиотека – Легкий, простой в использовании библиотеки тестирования для рендеринга, моделирования действий и обработки асинхронных методов – создан Кент C. Доддс
- jest – для запуска тестов и создания утверждений
Структура папки/файлов
- SRC/index.js – точка входа для нашего приложения React
- SRC/Jokegenerator.js – наше Контейнер Компонент, который выбирает, контролирует и предоставляет данные
- SRC/Joke.js – Простой компонент презентации
- SRC/__ Тесты __/Jokegenerator.test.js – содержит наши тесты
Ваш первый тест
Каждый раз, прежде чем мы создадим компонент Мы будем писать сбой теста сначала, а затем попытаться пройти через Отказ Давайте начнем с написания теста на наш фигурную компонент <Шутка /> Что сделает текст от реквизитов.
Чтение сверху: мы используем оказывать Метод из Реагистрационная тестирование-библиотека и пройти и LT; JOK E/> Компонент (который не существует в этот момент) в него. Он возвращает объект, содержащий несколько очень полезных методов (найдите полный список доступных мне Thod S здесь) – для бывшего Достаточно Getby Сжал. Затем он возвращает HTML-элемент BAS Эд на Data-T estid как аргумент.
Далее мы пишем ожидать Используя выше метод и data-testid, И проверьте, содержит ли элемент текст из реквизитов. После запуска тестов мы получаем:
Да, мы хотим, чтобы это не удалось! <Шутка /> Еще не существует, помните? Мы создали только Пустой джо ke.j S файл до сих пор. Мы написали тест, в котором мы можем ясно видеть, что мы ожидаем, что компонент. Теперь наша работа – сделать Тестовый проход без модификации TES T код. Давайте сделаем это тогда:
Теперь, если вы сделали все так, как я, тест должен пройти:)
Второй компонент
Наш второй компонент будет отвечать за получение случайной шутки после того, как пользователь нажимает кнопку. Мы сохраним его в состоянии компонента и передаем его нашим <Шутка /> Компонент. Мы также хотели бы отобразить сообщение по умолчанию, когда шутка еще не загружена.
Конечно, мы начинаем с теста первыми. Это больший компонент, поэтому мы будем писать тест-шаг за шагом. Мы также убедимся, что это проходит как можно чаще.
Мы уже знакомы с оказывать метод, но на этот раз мы берем getbytext от возврата объекта. Как вы уже догадались, метод возвращает HTML-элемент, если он существует в DOM.
Запустите тесты и …
Вы знаете, что с этим делать:
Тест все еще не удается, но на этот раз он выводит другую ошибку:
Вы еще не загрузили шутки Отказ Это может быть потому, что текст разбит несколькими элементами. В этом случае вы можете предоставить функцию для вашего текстового помощника, чтобы сделать ваш сопоставитель более гибким.
Давайте быстро исправить это, представляя Государство нашему компоненту и отображение сообщения по умолчанию, когда нет шутка в Государство Отказ
Испытания проходят сейчас, поэтому мы можем двигаться дальше, чтобы добавить новые функции. Представьте, что, когда мы нажимаем на кнопку, текст по умолчанию в компоненте исчезает, чтобы освободить место для сообщения « Loading … ». Звучит довольно просто, верно? Мы можем проверить этот сценарий только с Три Линии кода!
Давайте импортируем Симулировать Сначала метод, поскольку нам нужно понадобиться:
Разница между QueryByText и getbytext в том, что каждый возвращается, когда элемент не найден. Первый возвращается нулевой а второй бросает сообщение об ошибке Отказ Переполнение тестов:
Нам нужно создать кнопку и установить onclick Метод, который установит Загрузка Государство в правда Отказ
Так же, как тест проходит снова. Теперь пришло время получить нашу случайную шутку! Ну … это не будет случайным в наших тестах. Мы будем высмеивать его, используя Mockaxios Отказ
Наше наши тесты в jokegenerator.test.js, Вставьте эти две строки кода:
Первая строка создает новый экземпляр Mockaxios со случайной задержкой. Вторая строка берет и выполняет функцию обратного вызова после выполнения всех тестов в этом файле и удаляет издеватое состояние из Axios Отказ
В верхней части нашего второго теста, где мы тестируем
Он издевается от ответа любого Получить Вызов сделан через Axios. . В конце того же теста:
Не забудьте импортировать ждать :
ждать Метод ждет (4500 мс по умолчанию) до тех пор, пока функция обратного вызова не перестает бросать ошибку. Проверено через интервалы 50 мс. По сути, мы просто ждем, пока загрузка не исчезнет из дома.
ждать также доступен как отдельный Пакет NPM ( React-Testing-library использует его как зависимость). Это было создано Łukasz gozda gandecki .
После изготовления всех модификаций кода и запустите тесты, мы должны получить следующее сообщение Fail:
Как вы думаете, что это может быть? Согласно нашему тесту, мы ожидаем, что погрузочное сообщение исчезло. Кроме того, мы хотим получить нашу шутку от API и сохранить его на штат Так что следующее ожидать проходит.
Испытания должны проходить снова сейчас. Мы уверены, что все работает, как ожидалось … не так ли? Обратите внимание, что у нас есть Никогда не открыл свой браузер и проверил вручную, если ваше приложение даже работает … Однако, благодаря чему мы писали наши тесты ( так, чтобы наши тесты напоминали, как пользователь будет использовать приложение ), мы можем быть почти на 100% уверены, что наше небольшое приложение просто работает.
В качестве последнего куска кода давайте добавим это к index.js и откройте браузер:)
Бонус
Из-за того, как мы написали наши тесты, мы можем использовать их как E2E Тесты Без добавления одной строки кода! Все, что нам нужно сделать, это удалить все линии, связанные с Mockaxios и снова запустить тесты! Теперь они будут использовать реальную внешнюю API. Круто, не так ли?:)
Резюме
Весь код доступен на проекте CodeSandbox Отказ Я действительно рекомендую вам познакомиться с полным Реагистрационная тестирование-библиотека документация. Вы найдете там еще много примеров и использования случаев.
Я надеюсь, тебе понравилось мой Краткое руководство по TDD в реакции, И что вы узнали что-то новое сегодня.
Оригинал: “https://www.freecodecamp.org/news/quick-guide-to-tdd-in-react-81888be67c64/”