Издевательство над Javascript с помощью Jest
Я использую Jest mocking в течение некоторого времени, и я должен признать, что мне приходится прыгать по разным статьям, чтобы сделать свое дело. Поэтому я решил собрать воедино некоторые вещи, которые, по моему мнению, могут быть полезны другим, новичкам в тестировании.
Насмешки
Согласно шутке:
«Мок-функции позволяют вам тестировать связи между кодом, стирая реальную реализацию функции, перехватывая вызовы функции (и параметры, передаваемые в этих вызовах), перехватывая экземпляры функций-конструкторов при создании экземпляра с помощью new
и разрешая тест- временная конфигурация возвращаемых значений».
Проще говоря, Mocking — это способ отключить испытуемый от любых его зависимостей, которые у него могут быть, и заменить их поддельной реализацией. Это позволяет вам сосредоточиться на тестировании очень конкретной единицы кода, которую вы написали.
Шутка издевается над типами
В Jest доступно 3 типа имитации модулей и функций:
jest.fn
: используется для имитации функцииjest.mock
: используется для имитации модуляjest.spyOn
: шпионить за функцией или издеваться над ней
Хотя они могут использоваться взаимозаменяемо, они созданы для обработки очень специфического варианта использования.
В приведенных ниже примерах мы попробуем протестировать этот код:
Моделирование функций — jest.fn()
Функция mock позволяет изменять реализацию, перехватывать вызовы и изменять возвращаемое значение. Давайте посмотрим на них:
- Базовое издевательство
Самый простой способ имитировать функцию — вызвать jest.fn().
В приведенном выше фрагменте кода вы можете видеть, что, написав всего одну строку кода calculator.add = jest.fn();
, мы можем создать макет для функции добавления калькулятора. С помощью этого однострочника вы можете проверить следующее:
- количество раз, когда вызов попадает в издевательскую функцию,
- издевательская функция была вызвана
Если вы хотите, вы также можете изменить реализацию фиктивной функции. Обратитесь к приведенному ниже коду:
С реализацией no/fake вы можете фактически проверять состояние макета каждый раз, когда он вызывается. Состояние включает в себя:
- аргумент, полученный для каждого вызова
- результат возвращен
- раз вызывается
Хотя имитация функций предоставляет отличные возможности, она не очень популярна, потому что требует имитации для каждой функции, которую может предложить модуль. Итак, скажем, модуль калькулятора имеет 4 функции, а именно:
- добавлять
- вычесть
- умножить
- разделять
Затем все функции нуждаются в отдельной имитации функций. Итак, вы бы сделали что-то вроде:
Лучше всего обойти это, выполнив издевательство над модулем. Давайте рассмотрим это в следующем разделе.
Имитация модуля — jest.mock()
Чтобы добиться индивидуального издевательства (сверху), вы можете просто сделать это jest.mock('calculator').
Это гарантирует, что все отдельные функции из этого модуля будут имитированы. Давайте посмотрим, как вы можете его использовать:
Единственным недостатком этого насмешливого стиля является то, что становится трудно протестировать реальную реализацию. Если вы заинтересованы в тестировании базовой функции, вам следует использовать jest.spyOn
.
Шпион — jest.spyOn
Когда вы создаете экземпляр шпиона, вызывая jest.spyOn()
, он фактически работает аналогично jest.fn
, но также отслеживает вызовы object[methodName].
. В конфигурации по умолчанию jest.spyOn()
вызывает реальную реализацию метода. Давайте посмотрим, как это работает:
Лучшее в шпионах то, что у вас также может быть фиктивная реализация. Что-то вроде этого:
Заключение
В этом очень кратком введении о мокировании мы узнали о мокировании функций, мокировании модулей и шпионах. Мы также узнали, как можно подделать реализацию функции и установить возвращаемые значения. Этой статьи далеко не достаточно о насмешках, и чтобы узнать больше, перейдите по этой ссылке.
Не стесняйтесь оставлять комментарии, если вам нравится, что это было полезно или если в коде есть ошибка.
Скоро: статья о различных API фиктивных функций.