PassFront
  1. PassFront
  2. База знаний
  3. Unit и компонентные тесты

Зачем нужен MSW и чем он лучше мока fetch?

Unit и компонентные тесты

MSW (Mock Service Worker) перехватывает сетевые запросы на уровне сети и отвечает заданными данными, поэтому приложение выполняет настоящий fetch или axios.

Преимущества

  • Код приложения не знает о моках: тест проверяет реальный путь запроса и обработку ответа.
  • Те же обработчики работают в тестах, Storybook и в браузере при разработке.
  • Легко моделировать ошибки сервера, медленный ответ и сетевой сбой.
import { http, HttpResponse } from 'msw';
import { setupServer } from 'msw/node';

const server = setupServer(
  http.get('/api/users', () => HttpResponse.json([{ id: 1, name: 'Ann' }])),
);

beforeAll(() => server.listen());
afterEach(() => server.resetHandlers());
afterAll(() => server.close());

test('shows error', async () => {
  server.use(http.get('/api/users', () => new HttpResponse(null, { status: 500 })));
  render(<Users />);
  expect(await screen.findByText('Не удалось загрузить')).toBeInTheDocument();
});

Против jest.fn на fetch

Мок fetch привязывает тест к способу вызова: другой клиент или заголовки ломают тест. MSW проверяет поведение независимо от клиента.

Коротко для собеседования

MSW подменяет сервер, а не клиент. Это стабильнее, переиспользуется и тестирует реальный сетевой код.

Другие вопросы раздела