Мокирование 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'. Настройте мок достаточно подробно, чтобы удовлетворить требования вашего теста.

Кинга Идем в IT: пошаговый план для смены профессии

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

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.