Короткий ответ
Mock — это объект-заглушка, который подменяет реальную зависимость, чтобы тест не обращался к сети, базе данных или окружению. unittest.mock даёт mock-объекты и декоратор patch() для подмены атрибутов, а фикстура monkeypatch из pytest безопасно меняет атрибуты, элементы словарей и переменные окружения с автоматическим откатом.
Как это работает подробнее
Внешние зависимости не вызываются по-настоящему: вместо них в тест подставляются заглушки с известным поведением, что делает тест быстрым и детерминированным.
- Mock-объекты.
unittest.mockизбавляет от ручного создания стабов: после действия проверяют, какие методы и с какими аргументами вызывались, например черезmock.method.assert_called_with(...). - Настройка поведения. Заглушке задают возвращаемое значение через
return_valueили заставляют вызов бросить исключение черезside_effect. - Патчинг. Декоратор
patch()подменяет атрибуты модулей и классов в пределах области действия теста. - Фикстура monkeypatch. В pytest меняет атрибуты, элементы словарей и переменные окружения методами
setattr(),setitem(),setenv()и другими, а такжеsys.path. - Автоматический откат. Все изменения
monkeypatchвозвращаются назад после завершения теста или фикстуры.
Пример кода
Подмена Path.home через monkeypatch
from pathlib import Path
def test_home(monkeypatch):
monkeypatch.setattr(Path, 'home', lambda: Path('/abc'))
assert Path.home() == Path('/abc')