Имитировать весь модуль с помощью Jest легко. Но что, если вы хотите имитировать только некоторые функции в модуле?

Jest - отличный фреймворк для тестирования JavaScript (или TypeScript). Он предлагает множество функций и множество руководств (с примерами) о том, как заставить их работать.

Хотите создать фиктивную функцию и передать ее в качестве обратного вызова тестируемому компоненту? Конечно! Вы даже можете дать ему собственную реализацию макета, если хотите.

Хотите смоделировать целый модуль или библиотеку? Требуется всего одна строчка кода. И вы также можете предоставить им собственные макетные реализации. Вы даже можете создавать макеты для определенных методов объекта.

Но знаете ли вы это чувство, когда в руководстве есть 50 различных примеров, которые, кажется, охватывают все под солнцем кроме варианта использования, который вы ищете? Хорошо, это может быть немного драматическая интерпретация, но суть вы уловили.

Что делать, если вы не хотите имитировать целый модуль или библиотеку? Что, если бы вы хотели поиздеваться над одной из его функций? Или несколько избранных?

Мне потребовалось довольно много времени, чтобы составить правильный запрос Google для этого. Итак, вот краткое руководство на случай, если вы когда-нибудь окажетесь в одной лодке. (И да, мне удалось найти его пример в официальной документации, когда я понял, что искать.)

Мокинг отдельной функции

Есть три простых (и немного сбивающих с толку) шага: имитировать только одну функцию модуля и оставить остальную его реализацию по умолчанию.

  1. Создайте макет для всего модуля.
  2. Скажите этому макету, чтобы он использовал реальные (немодельные) реализации для всего.
  3. Смоделируйте желаемую функцию макета.

Немного скороговорки, не правда ли? Но синтаксис действительно прост, и каждый из этих шагов занимает всего одну строку кода.

Сначала вы создаете макет модуля с помощью функции jest.mock. Функция mock принимает строку, представляющую путь к локальному модулю или имя библиотеки, которую вы хотите высмеять, точно так же, как это делает оператор import. В этом примере я буду обозначать это как path.

Затем вы говорите макету использовать реальные реализации всего в модуле с помощью функции jest.requireActual. Вы должны передать ту же строку, которая представляет путь или имя, которое вы передали в функции mock.

После того, как вы передадите требование для фактических реализаций, вы можете переопределить реализации функций, которые вы хотите имитировать. Вы просто перечисляете имена функций и присваиваете им значение jest.fn().

jest.fn() создаст пустую реализацию, но вы можете переопределить ее, чтобы она принимала аргументы и имела настраиваемое возвращаемое значение.

Вот три строки кода, которые вам нужно написать в своем тесте, чтобы заставить его работать.

В более новых версиях Jest вам может потребоваться сохранить результат jest.requireActual в переменной, а затем использовать оператор распространения, как показано ниже.

Вот и все. Спасибо за чтение!

Ресурсы

Больше контента на plainenglish.io