Что такое mock и для чего он используется
Что проверяют
Различаете ли вы виды тестовых дублёров и понимаете ли, зачем нужна изоляция. Кандидат, который зовёт мокой любую подмену, обычно и тесты пишет так, что они проверяют не код, а собственные заглушки.
Как отвечать
Начните с разделения терминов. Заглушка отдаёт заранее заданный ответ, фейк это упрощённая рабочая реализация (словарь вместо базы), шпион оборачивает настоящий объект и запоминает вызовы, а mock задаётся ожиданиями: тест проверяет, что метод вызвали, столько раз и с такими аргументами. В Python всё это даёт unittest.mock: Mock, MagicMock с реализованными dunder-методами, AsyncMock для корутин, patch как декоратор или контекстный менеджер.
with patch("app.service.client.get_data", return_value={"k": 1}) as get:
assert fetch() == {"k": 1}
get.assert_called_once_with(timeout=5)Дальше про меру: подменять стоит границы системы (сеть, время, файлы, очередь, платёжный шлюз), а не собственные классы внутри модуля. Хорошая формулировка: mock отвечает на вопрос «как мой код общается с соседом», а проверка результата на вопрос «что он посчитал».
Где спотыкаются
Патчат путь объявления вместо пути использования. patch подменяет имя там, где его ищут: если модуль сделал from x import get, патчить надо mymodule.get, иначе тест зелёный, а настоящий вызов ушёл в сеть.
Создают Mock() без спецификации, и опечатка в имени метода молча возвращает новый Mock, который в условии истинен. Лечится аргументом autospec=True или функцией create_autospec: подделка повторяет сигнатуру оригинала и падает на неверных аргументах.
Подменяют всё подряд, включая внутренние вызовы. Такой тест ломается от любого рефакторинга и не ломается от реальной ошибки, потому что проверяет структуру кода, а не поведение.