Мокирование ES6 модулей в Jest: решение с jest.mock
Быстрый ответ
Желаете мокать ES6 модули в Jest? Воспользуйтесь jest.mock('./modulePath', () => ({}))
. Замените ./modulePath
на путь к необходимому модулю и ({})
на ваши заглушки. Попробуем на функции doSomething
из данного модуля:
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. Разница между дефолтными и именованными экспортами
Вот как можно управлять экспортами по умолчанию:
import myDefault from './defaultModule';
jest.mock('./defaultModule', () => ({
__esModule: true, // Помогает интеграции ES6 с Jest.
default: jest.fn().mockImplementation(() => 'mocked default export'),
}));
А для именованных экспортов делается следующее:
import * as myModule from './namedModule';
jest.mock('./namedModule', () => ({
__esModule: true,
myNamedExport: jest.fn().mockImplementation(() => 'mocked named export'),
}));
С помощью __esModule: true
Jest обеспечивает поддержку имитации модулей, симулирующие поведение ES6.
3. Скрытое наблюдение без модификаций
Хотите использовать методы шпионажа без изменений? Воспользуйтесь функцией jest.spyOn
.
import * as myModule from './myModule';
jest.spyOn(myModule, 'myFunction'); // Вы красноречивый наблюдатель!
4. Адаптация моков с помощью jest.fn()
Для уникального поведения каждого теста следует настраивать моки при помощи функции jest.fn()
. Это предоставляет вам гибкость в любой ситуации.
5. Продвинутые методы мокирования
Сохраняйте файлы с моками в директории __mocks__
— Jest тогда заранее знает, где могут находиться моки для конкретных модулей.
6. Использование стрелочных функций для краткости моков
Для краткости кода порой полезно использовать стрелочные функции:
jest.mock('myModule', () => ({
myFunction: jest.fn().mockReturnValue("foobar"), // Просто и понятно.
}));
7. Поддержание последовательности
Не встраивайте jest.mock()
в тест-кейсы. Размещайте его в начале тестового файла, чтобы все импорты были приготовлены к мокированию с самого начала.
Визуализация
Импорты — эдакие двери в различные комнаты вашего приложения:
// Оригинальный модуль
🚪 <-> 🏠 // Уютный дом с настоящими функциональностями
Теперь давайте вставим Jest в картину:
// Мок модуль
🚪 <-> 🛖 // Временное укрытие, полное фиктивных функций
С использованием Jest:
// Реальный импорт
import { myFunction } from 'myModule';
превращается в:
import { myMockFunction } from 'myModule'; // ⤴️ Ведёт в мир фикции
Таким образом, создаём условия для тестирования!🏕️✅
Глубина мира мокирования
1. Управление динамикой поведения
Управляйте динамикой ваших моков, используя mockImplementation()
и mockImplementationOnce()
.
2. Значимость порядка тестов
Порядок выполнения тестов имеет значение. Используйте jest.resetAllMocks()
, чтобы начать каждый тест с чистого листа.
3. Искусство оценочных утверждений
Будьте осторожны при использовании expect().toHaveBeenCalledTimes
и expect().toHaveBeenCalledWith
. Это поможет вам держать всё под контролем.
4. Директория mocks
Jest автоматически находит моки в директории __mocks__
. Создавайте там файлы с заглушками, имитирующими реальные модули.
Полезные материалы
- ES6 Class Mocks · Jest — практическое руководство по мокированию ES6 классов с помощью Jest.
- How can I mock an ES6 module import using Jest? – Stack Overflow — масса полезных рекомендаций.
- Mock Functions · Jest — подробная инструкция по мокированию функций.
- YouTube видео — обучающее видео.
- Understanding Jest Mocks – Rick Hanlon II | Medium — глубокое погружение в мир моков Jest.
- Issue о модульной фабрике
jest.mock()
· GitHub — обсуждение использования jest и переменных на GitHub. - Getting Started · Jest — стартовая страница для знакомства с Jest.