Mock Service Worker (MSW) — это инструмент, предназначенный для перехвата HTTP-запросов в тестах и замены их мока (заглушками). В отличие от традиционного мокирования с помощью библиотек вроде jest.mock(), MSW использует сервис-воркеры браузера для того, чтобы перехватывать запросы на уровне сетевого слоя. Это позволяет более реалистично тестировать взаимодействие с API, не затрагивая реальные сетевые ресурсы.
Использование MSW предоставляет несколько значительных преимуществ при тестировании API-запросов:
Для начала нужно установить библиотеку MSW, если она ещё не установлена:
npm install msw --save-dev
После этого необходимо настроить сервис-воркера и использовать его в тестах.
В MSW обработчики (handlers) — это функции, которые перехватывают
запросы и возвращают заранее заданные ответы. Каждый обработчик зависит
от типа HTTP-запроса (например, GET, POST,
PUT, DELETE) и URL-адреса, на который он
должен реагировать.
Пример создания обработчика для GET запроса:
import { rest } from 'msw';
export const handlers = [
rest.get('https://api.example.com/data', (req, res, ctx) => {
return res(
ctx.status(200),
ctx.json({ message: 'Успешный запрос' })
);
}),
];
В этом примере запрос к API https://api.example.com/data
будет перехвачен и возвращен ответ с кодом статуса 200 и телом ответа в
формате JSON.
После того как обработчики созданы, необходимо активировать
сервис-воркер. Это делается с помощью функции setupWorker,
которая используется для перехвата запросов в браузере.
import { setupWorker } from 'msw';
import { handlers } from './handlers';
const worker = setupWorker(...handlers);
beforeAll(() => worker.start());
afterAll(() => worker.stop());
Этот код запускает сервис-воркер перед началом всех тестов и останавливает его после их выполнения. Важно, чтобы запуск сервис-воркера происходил только один раз в начале тестов, иначе могут возникнуть проблемы с дублированием запросов.
MSW интегрируется с Jest через глобальные хуки для настройки и очистки сервис-воркера.
Пример полного теста с использованием MSW:
import { render, screen, fireEvent } from '@testing-library/react';
import MyComponent from './MyComponent';
import { setupWorker } from 'msw';
import { handlers } from './handlers';
const worker = setupWorker(...handlers);
beforeAll(() => worker.start());
afterAll(() => worker.stop());
test('Проверка успешного получения данных с API', async () => {
render(<MyComponent />);
const button = screen.getByText(/Загрузить данные/i);
fireEvent.click(button);
const message = await screen.findByText(/Успешный запрос/i);
expect(message).toBeInTheDocument();
});
MSW позволяет работать с различными HTTP-методами, такими как
GET, POST, PUT,
DELETE. Обработчики можно настраивать для каждого типа
запроса в зависимости от нужд теста.
POST запроса:rest.post('https://api.example.com/submit', (req, res, ctx) => {
const { name } = req.body;
return res(
ctx.status(201),
ctx.json({ message: `Пользователь ${name} создан` })
);
}),
Этот обработчик перехватывает запросы POST и возвращает ответ с статусом 201 и сообщением о создании пользователя.
Можно использовать параметры в URL, чтобы мокировать динамические запросы.
rest.get('https://api.example.com/users/:id', (req, res, ctx) => {
const { id } = req.params;
return res(
ctx.status(200),
ctx.json({ userId: id, name: 'Иван Иванов' })
);
}),
В этом примере обработчик будет перехватывать запросы с динамическим
параметром id и возвращать информацию о пользователе.
MSW имеет встроенную систему логирования, которая полезна для
отладки. Чтобы включить логирование, нужно передать параметр
logLevel при старте сервис-воркера:
const worker = setupWorker(...handlers);
worker.start({ logLevel: 'debug' });
С помощью логов можно следить за тем, какие запросы перехватываются, а также за тем, какие ответы отправляются.
MSW также позволяет тестировать обработку ошибок, что важно для проверки стабильности приложения в случае проблем с API.
Пример обработчика для имитации ошибки:
rest.get('https://api.example.com/data', (req, res, ctx) => {
return res(
ctx.status(500),
ctx.json({ error: 'Внутренняя ошибка сервера' })
);
}),
С помощью этого обработчика можно смоделировать ошибку сервера и проверить, как приложение реагирует на такие ситуации.
Использование MSW помогает создать более стабильные и предсказуемые тесты для приложений, взаимодействующих с внешними API, позволяя тестировать различные сценарии без зависимости от состояния и доступности реальных сервисов.