Этот пост является частью моей серии, посвященной модульному тестированию с помощью Jest в React Native. Введение можно найти здесь.

Во время модульного тестирования кода с помощью Jest вы можете столкнуться с необходимостью эмулировать определенную функцию. Например, функция выборки, выполняющая HTTP-запросы, или некоторые процедуры, связанные с аппаратным обеспечением. В таких случаях приходится использовать насмешки. К счастью, jest поддерживает различные стили насмешек из коробки.

Насмешка 101

Издеваться над модулем означает просто имитировать его поведение. Это необходимо, когда тестируемая подпрограмма имеет сложные внешние зависимости, которые трудно включить в модульный тест. Jest обрабатывает насмешки с помощью функции имитации. Функция имитации создается следующим образом: jest.fn(). Затем вы можете указать реализацию этой функции, ее возвращаемое значение и выполнить над ней утверждения. Посмотрите этот пример:

Подробнее о мок-функциях можно прочитать в jest docs.

Автомокинг

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

automock: true

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

jest.unmock(module name);

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

шутка

Другой подход — имитировать конкретный модуль. Для этого используйте jest.mock(module name). При желании вы можете предоставить функцию для настройки результата имитации. Посмотрите этот пример:

Вы можете видеть, что мы издеваемся над модулем axios и нашим состоянием редукции. Для axios используется mocking по умолчанию, а для redux мы указываем пользовательскую реализацию.

шутка.spyOn

Иногда вы хотите сохранить поведение функции, но при этом указать, когда и как она была вызвана. Для этих целей подойдет jest.spyOn.

Вы можете видеть, что мы следим за функцией console.error, чтобы убедиться, что do_stuff ничего не записывает в консоль. Однако это так, и тест терпит неудачу. Обратите внимание, что в этом случае по-прежнему вызывается исходный console.error, в отличие от предыдущих примеров.

Теперь у вас должно быть лучшее понимание фиктивных модулей во время тестирования. В следующих частях я расскажу об отчетах о покрытии и тестировании компонентов.

Первоначально опубликовано на https://everyday.codes