Издевательство над Javascript с помощью Jest

Я использую Jest mocking в течение некоторого времени, и я должен признать, что мне приходится прыгать по разным статьям, чтобы сделать свое дело. Поэтому я решил собрать воедино некоторые вещи, которые, по моему мнению, могут быть полезны другим, новичкам в тестировании.

Насмешки

Согласно шутке:

«Мок-функции позволяют вам тестировать связи между кодом, стирая реальную реализацию функции, перехватывая вызовы функции (и параметры, передаваемые в этих вызовах), перехватывая экземпляры функций-конструкторов при создании экземпляра с помощью new и разрешая тест- временная конфигурация возвращаемых значений».

Проще говоря, Mocking — это способ отключить испытуемый от любых его зависимостей, которые у него могут быть, и заменить их поддельной реализацией. Это позволяет вам сосредоточиться на тестировании очень конкретной единицы кода, которую вы написали.

Шутка издевается над типами

В Jest доступно 3 типа имитации модулей и функций:

  • jest.fn: используется для имитации функции
  • jest.mock: используется для имитации модуля
  • jest.spyOn: шпионить за функцией или издеваться над ней

Хотя они могут использоваться взаимозаменяемо, они созданы для обработки очень специфического варианта использования.

В приведенных ниже примерах мы попробуем протестировать этот код:

Моделирование функций — jest.fn()

Функция mock позволяет изменять реализацию, перехватывать вызовы и изменять возвращаемое значение. Давайте посмотрим на них:

  • Базовое издевательство

Самый простой способ имитировать функцию — вызвать jest.fn().

В приведенном выше фрагменте кода вы можете видеть, что, написав всего одну строку кода calculator.add = jest.fn();, мы можем создать макет для функции добавления калькулятора. С помощью этого однострочника вы можете проверить следующее:

  1. количество раз, когда вызов попадает в издевательскую функцию,
  2. издевательская функция была вызвана

Если вы хотите, вы также можете изменить реализацию фиктивной функции. Обратитесь к приведенному ниже коду:

С реализацией no/fake вы можете фактически проверять состояние макета каждый раз, когда он вызывается. Состояние включает в себя:

  1. аргумент, полученный для каждого вызова
  2. результат возвращен
  3. раз вызывается

Хотя имитация функций предоставляет отличные возможности, она не очень популярна, потому что требует имитации для каждой функции, которую может предложить модуль. Итак, скажем, модуль калькулятора имеет 4 функции, а именно:

  1. добавлять
  2. вычесть
  3. умножить
  4. разделять

Затем все функции нуждаются в отдельной имитации функций. Итак, вы бы сделали что-то вроде:

Лучше всего обойти это, выполнив издевательство над модулем. Давайте рассмотрим это в следующем разделе.

Имитация модуля — jest.mock()

Чтобы добиться индивидуального издевательства (сверху), вы можете просто сделать это jest.mock('calculator'). Это гарантирует, что все отдельные функции из этого модуля будут имитированы. Давайте посмотрим, как вы можете его использовать:

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

Шпион — jest.spyOn

Когда вы создаете экземпляр шпиона, вызывая jest.spyOn() , он фактически работает аналогично jest.fn, но также отслеживает вызовы object[methodName].. В конфигурации по умолчанию jest.spyOn() вызывает реальную реализацию метода. Давайте посмотрим, как это работает:

Лучшее в шпионах то, что у вас также может быть фиктивная реализация. Что-то вроде этого:

Заключение

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

Не стесняйтесь оставлять комментарии, если вам нравится, что это было полезно или если в коде есть ошибка.

Скоро: статья о различных API фиктивных функций.