В чём разница между 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 заменяет упрощённой реализацией. Подменять надо границы, а не внутренности.