Как замокать HTTP-запросы в тестах (nock/msw) и зачем?
1️⃣ Как кратко ответить
Мокирование HTTP-запросов в тестах с помощью библиотек nock или msw позволяет изолировать тестируемый код от внешних API, обеспечивая стабильность и предсказуемость тестов. Nock используется для мокирования HTTP-запросов на уровне Node.js, а MSW — для работы как с Node.js, так и с браузером, перехватывая запросы на уровне Service Worker.
2️⃣ Подробное объяснение темы
Мокирование HTTP-запросов — это процесс замены реальных сетевых вызовов фиктивными, чтобы тестировать код в изолированной среде. Это важно, потому что реальные API могут быть недоступны, медленны или изменяться, что делает тесты нестабильными. Мокирование позволяет контролировать ответы API и тестировать различные сценарии, такие как ошибки или задержки.
Зачем это нужно?
- Изоляция тестов: Устраняет зависимость от внешних сервисов, что делает тесты более надежными и быстрыми.
- Контроль над ответами: Позволяет тестировать различные сценарии, включая ошибки и исключительные ситуации.
- Повышение скорости тестирования: Исключает задержки, связанные с сетевыми вызовами.
- Доступность: Тесты могут выполняться даже при недоступности внешних API.
Как это работает?
Nock
Nock — это библиотека для Node.js, которая позволяет перехватывать и мокировать HTTP-запросы. Она работает на уровне HTTP-модуля Node.js и позволяет задавать ожидаемые запросы и их фиктивные ответы.
Пример использования Nock:
const nock = require('nock');
const axios = require('axios');
// Настройка мокирования
nock('https://api.example.com')
.get('/users/1')
.reply(200, { id: 1, name: 'John Doe' });
// Функция, которая делает HTTP-запрос
async function fetchUser() {
const response = await axios.get('https://api.example.com/users/1');
return response.data;
}
// Тест
fetchUser().then(user => {
console.log(user); // { id: 1, name: 'John Doe' }
});
nock('https://api.example.com'): Указывает базовый URL, который будет перехватываться..get('/users/1'): Определяет HTTP-метод и путь, который будет замокирован..reply(200, { id: 1, name: 'John Doe' }): Устанавливает код ответа и тело ответа, которые будут возвращены при вызове.
MSW (Mock Service Worker)
MSW — это библиотека, которая работает как в браузере, так и в Node.js. Она использует Service Worker для перехвата запросов в браузере и позволяет мокировать запросы на уровне клиента.
Пример использования MSW:
// handlers.js
import { rest } from 'msw';
export const handlers = [
rest.get('https://api.example.com/users/1', (req, res, ctx) => {
return res(
ctx.status(200),
ctx.json({ id: 1, name: 'John Doe' })
);
}),
];
// setupTests.js
import { setupServer } from 'msw/node';
import { handlers } from './handlers';
const server = setupServer(...handlers);
// Запуск сервера перед всеми тестами
beforeAll(() => server.listen());
// Сброс обработчиков после каждого теста
afterEach(() => server.resetHandlers());
// Остановка сервера после завершения всех тестов
afterAll(() => server.close());
rest.get('https://api.example.com/users/1', ...): Определяет HTTP-метод и URL, который будет перехватываться.res(ctx.status(200), ctx.json({ id: 1, name: 'John Doe' })): Устанавливает код ответа и тело ответа, которые будут возвращены.setupServer(...handlers): Создает сервер для перехвата запросов в Node.js.
Где применяется?
Мокирование HTTP-запросов широко используется в юнит-тестах и интеграционных тестах для фронтенд и бэкенд приложений. Это позволяет разработчикам тестировать функциональность, связанную с сетевыми вызовами, без необходимости взаимодействия с реальными API.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться