Мокирование ES6 модулей в Jest: решение с jest.mock

Пройдите тест, узнайте какой профессии подходите
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Желаете мокать ES6 модули в Jest? Воспользуйтесь jest.mock('./modulePath', () => ({})). Замените ./modulePath на путь к необходимому модулю и ({}) на ваши заглушки. Попробуем на функции doSomething из данного модуля:

JS
Скопировать код
import { doSomething } from './exampleModule';
jest.mock('./exampleModule', () => ({
  doSomething: jest.fn(() => 'mocked value'),
}));

// exampleModule.doSomething теперь возвращает 'mocked value'.

Таким образом, doSomething будет возвращать 'mocked value'. Настройте мок достаточно подробно, чтобы удовлетворить требования вашего теста.

Пошаговый план для смены профессии

Корректное мокирование

1. Избегание побочных эффектов мутации

Прямые модификации импортированной функции, например dependency.doSomething = jest.fn(), не рекомендуются. Вместо этого следует использовать jest.mock.

2. Разница между дефолтными и именованными экспортами

Вот как можно управлять экспортами по умолчанию:

JS
Скопировать код
import myDefault from './defaultModule';
jest.mock('./defaultModule', () => ({
  __esModule: true, // Помогает интеграции ES6 с Jest.
  default: jest.fn().mockImplementation(() => 'mocked default export'),
}));

А для именованных экспортов делается следующее:

JS
Скопировать код
import * as myModule from './namedModule';
jest.mock('./namedModule', () => ({
  __esModule: true,
  myNamedExport: jest.fn().mockImplementation(() => 'mocked named export'),
}));

С помощью __esModule: true Jest обеспечивает поддержку имитации модулей, симулирующие поведение ES6.

3. Скрытое наблюдение без модификаций

Хотите использовать методы шпионажа без изменений? Воспользуйтесь функцией jest.spyOn.

JS
Скопировать код
import * as myModule from './myModule';
jest.spyOn(myModule, 'myFunction'); // Вы красноречивый наблюдатель!

4. Адаптация моков с помощью jest.fn()

Для уникального поведения каждого теста следует настраивать моки при помощи функции jest.fn(). Это предоставляет вам гибкость в любой ситуации.

5. Продвинутые методы мокирования

Сохраняйте файлы с моками в директории __mocks__ — Jest тогда заранее знает, где могут находиться моки для конкретных модулей.

6. Использование стрелочных функций для краткости моков

Для краткости кода порой полезно использовать стрелочные функции:

JS
Скопировать код
jest.mock('myModule', () => ({
  myFunction: jest.fn().mockReturnValue("foobar"), // Просто и понятно.
}));

7. Поддержание последовательности

Не встраивайте jest.mock() в тест-кейсы. Размещайте его в начале тестового файла, чтобы все импорты были приготовлены к мокированию с самого начала.

Визуализация

Импорты — эдакие двери в различные комнаты вашего приложения:

Markdown
Скопировать код
// Оригинальный модуль
🚪 <-> 🏠 // Уютный дом с настоящими функциональностями

Теперь давайте вставим Jest в картину:

Markdown
Скопировать код
// Мок модуль
🚪 <-> 🛖 // Временное укрытие, полное фиктивных функций

С использованием Jest:

Markdown
Скопировать код
// Реальный импорт
import { myFunction } from 'myModule';

превращается в:

Markdown
Скопировать код
import { myMockFunction } from 'myModule'; // ⤴️ Ведёт в мир фикции

Таким образом, создаём условия для тестирования!🏕️✅

Глубина мира мокирования

1. Управление динамикой поведения

Управляйте динамикой ваших моков, используя mockImplementation() и mockImplementationOnce().

2. Значимость порядка тестов

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

3. Искусство оценочных утверждений

Будьте осторожны при использовании expect().toHaveBeenCalledTimes и expect().toHaveBeenCalledWith. Это поможет вам держать всё под контролем.

4. Директория mocks

Jest автоматически находит моки в директории __mocks__. Создавайте там файлы с заглушками, имитирующими реальные модули.

Полезные материалы

  1. ES6 Class Mocks · Jest — практическое руководство по мокированию ES6 классов с помощью Jest.
  2. How can I mock an ES6 module import using Jest? – Stack Overflow — масса полезных рекомендаций.
  3. Mock Functions · Jest — подробная инструкция по мокированию функций.
  4. YouTube видео — обучающее видео.
  5. Understanding Jest Mocks – Rick Hanlon II | Medium — глубокое погружение в мир моков Jest.
  6. Issue о модульной фабрике jest.mock() · GitHub — обсуждение использования jest и переменных на GitHub.
  7. Getting Started · Jest — стартовая страница для знакомства с Jest.
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Как правильно мокировать ES6 модули в Jest?
1 / 5