← Назад ко всем вопросам

Как замокать HTTP-запросы в тестах (nock/msw) и зачем?

1️⃣ Как кратко ответить

Мокирование HTTP-запросов в тестах с помощью библиотек nock или msw позволяет изолировать тестируемый код от внешних API, обеспечивая стабильность и предсказуемость тестов. Nock используется для мокирования HTTP-запросов на уровне Node.js, а MSW — для работы как с Node.js, так и с браузером, перехватывая запросы на уровне Service Worker.

2️⃣ Подробное объяснение темы

Мокирование HTTP-запросов — это процесс замены реальных сетевых вызовов фиктивными, чтобы тестировать код в изолированной среде. Это важно, потому что реальные API могут быть недоступны, медленны или изменяться, что делает тесты нестабильными. Мокирование позволяет контролировать ответы API и тестировать различные сценарии, такие как ошибки или задержки.

Зачем это нужно?

  1. Изоляция тестов: Устраняет зависимость от внешних сервисов, что делает тесты более надежными и быстрыми.
  2. Контроль над ответами: Позволяет тестировать различные сценарии, включая ошибки и исключительные ситуации.
  3. Повышение скорости тестирования: Исключает задержки, связанные с сетевыми вызовами.
  4. Доступность: Тесты могут выполняться даже при недоступности внешних 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.

Тема: JavaScript
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки