Вопрос или проблема
Ручные моки с ECMAScript Jest.
Ответ или решение
Для работы с ручными моками в Jest с использованием ECMAScript, необходимо следовать определённой процедуре. Jest предоставляет мощный механизм для создания моков, позволяющий эффективно тестировать ваши модули.
Шаг 1: Создание структуры проекта
Сначала убедитесь, что у вас есть проект с установленным Jest. Если вы еще не установили Jest, вы можете сделать это с помощью npm:
npm install --save-dev jest
Шаг 2: Создание мока
Для создания ручного мока вам нужно создать папку __mocks__
в той же директории, что и ваш модуль. Назовем модуль, который мы собираемся мокировать, module.js
.
Структура проекта:
/project
├── __mocks__
│ └── module.js
├── module.js
├── test.js
└── package.json
Пример мока
Допустим, у вас есть следующий модуль (module.js
):
export const fetchData = async () => {
// Имитация получения данных с API
return await fetch('https://api.example.com/data').then(response => response.json());
};
Вы можете создать моку (__mocks__/module.js
) следующим образом:
export const fetchData = jest.fn().mockResolvedValue({ data: 'mocked data' });
Здесь мы используем jest.fn()
для создания мока функции fetchData
, которая возвращает промис с заданным значением.
Шаг 3: Настройка теста
Теперь давайте напишем тест для нашего модуля, который использует мок. Создадим файл test.js
:
import { fetchData } from './module';
jest.mock('./module'); // Это подключает наш мок
test('fetchData возвращает замокированные данные', async () => {
const data = await fetchData();
expect(data).toEqual({ data: 'mocked data' });
expect(fetchData).toHaveBeenCalled(); // Проверяем, что функция была вызвана
});
Шаг 4: Запуск тестов
Теперь вы можете запустить тесты в вашем проекте с помощью команды:
npm test
Важные замечания
-
Изоляция тестов: Каждый тест будет использовать свежую версию вашего мока благодаря тому, что Jest сбрасывает состояние моков после каждого теста, чтобы не было пересечений.
-
Обращение к оригинальному коду: Если вам нужно использовать оригинальную реализацию функции в определённых тестах, вы можете сделать это, вызвав
jest.requireActual
:
const actualFetchData = jest.requireActual('./module').fetchData;
// Используйте actualFetchData вместо моковой функции
- Параметры: Вы можете настроить возвращаемые значения мока с помощью
mockImplementation
или настроить его на возврат значений в зависимости от входных параметров.
Заключение
Использование ручных моков в Jest позволяет вам более гибко тестировать ваши модули, контролировать поведение зависимостей и создавать предсказуемые тестовые сценарии. Этот подход значительно упрощает процесс отладки и обеспечивает высокое качество кода.