Что такое Mock

Ответ

Mock (мок) — это заглушка, имитирующая поведение реального объекта или модуля в тестах. Используется для изоляции тестируемого кода от внешних зависимостей (API, базы данных и т.д.).

Пример мока функции fetch в Jest:

jest.mock('node-fetch');
const fetch = require('node-fetch');
const {Response} = jest.requireActual('node-fetch');

test('fetches data', async () => {
  fetch.mockResolvedValue(new Response(JSON.stringify({data: 'test'})));

  const result = await getData(); // тестируемая функция
  expect(result).toEqual({data: 'test'});
});

Основные случаи использования:

  • Тестирование компонентов без реальных API-вызовов
  • Имитация ошибок для проверки обработки исключений
  • Ускорение тестов за счет замены медленных операций

Моки бывают разных видов: spy (шпион), stub (заглушка), fake (фейк). В Jest чаще всего используются через jest.fn() или jest.mock().

Ответ 18+ 🔞

А, моки, блядь! Ну это ж классика, ёпта! Сейчас объясню, как это работает, чтобы ты не пиздел потом, что не понял.

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

Вот тут-то и появляется мок — это такая, блядь, заглушка, подстава. Как актёр-дублёр. Ты подменяешь реальную, ебаную зависимость (типа запроса в сеть или в базу) на её муляж, который ведёт себя ровно так, как ты ему прикажешь в рамках теста.

Вот смотри, пример на Jest, чтобы было понятно, как это выглядит в коде. Блок кода не трогаю, как велено.

jest.mock('node-fetch');
const fetch = require('node-fetch');
const {Response} = jest.requireActual('node-fetch');

test('fetches data', async () => {
  fetch.mockResolvedValue(new Response(JSON.stringify({data: 'test'})));

  const result = await getData(); // тестируемая функция
  expect(result).toEqual({data: 'test'});
});

Видишь, что происходит? Мы говорим Jest: «Слушай, дружок, когда в моём коде будут вызывать node-fetch, ты подсуну им нашу подставную крысу — jest.fn(). А мы ей заранее пропишем, что она должна вернуть». И вуаля, блядь! Тест работает в полной изоляции, как в барокамере. Никаких реальных вызовов, всё быстро и предсказуемо.

А зачем это всё, спросишь? Да похуй, но я отвечу:

  • Тестируешь логику, а не чужой сервис. Тебе же надо проверить, как твой код обрабатывает ответ, а не то, работает ли сегодня гугл. Вот ты и имитируешь и успешный ответ, и ошибку «404 — не найдено», чтобы посмотреть, не обосрётся ли твоя функция.
  • Скорость, ёбана! Замена похода в базу данных или на другой конец света на вызов функции в памяти — это как сменить телегу на реактивный самолёт. Тесты перестают ебать мозг и выполняются за секунды.
  • Стабильность. Сегодня API вернул одно, завтра — другое, послезавтра — «504 Gateway Timeout». С моками у тебя всегда один и тот же, контролируемый сценарий. Никаких сюрпризов, нахуй.

В Jest, например, это делается через jest.fn() (создаёт шпиона-заглушку) или jest.mock() (подменяет целый модуль). Есть ещё, конечно, «стабы», «фейки» и прочая хуйня — но суть одна: создать управляемую подмену, чтобы не зависеть от внешнего мира, который, как известно, полон пидарасов и нестабильности.

Короче, моки — это твои лучшие друзья в мире тестов. Прям как презерватив — изолируют от нежелательных последствий и внешних зараз. Пользуйся, не ёбнись.