PassFront
  1. PassFront
  2. База знаний
  3. Основы тестирования

В чём разница между mock, stub, spy и fake?

Основы тестирования

Все четыре — тестовые двойники, которые заменяют настоящую зависимость, но с разными целями.

Различия

  • Stub — заготовка с заранее заданным ответом. Нужна, чтобы код получил данные: getUser всегда возвращает одного пользователя.
  • Mock — двойник с ожиданиями: проверяем, что метод вызван с нужными аргументами и нужное число раз.
  • Spy — обёртка над настоящей функцией, которая запоминает вызовы, но не подменяет поведение.
  • Fake — рабочая упрощённая реализация, например база данных в памяти.
const send = vi.fn().mockResolvedValue({ ok: true }); // stub и mock в одном
await submitForm(send, { name: 'Ann' });
expect(send).toHaveBeenCalledWith({ name: 'Ann' });

const spy = vi.spyOn(console, 'error'); // spy

Предостережение

Чрезмерные моки привязывают тест к реализации: он падает при рефакторинге, хотя поведение не изменилось. Подменяют границы системы (сеть, время, случайность), а не внутренние детали.

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

Stub отдаёт данные, mock проверяет вызовы, spy наблюдает, fake заменяет упрощённой реализацией. Подменять надо границы, а не внутренности.

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