Можете ли вы объяснить, что подразумевается под mock-объектами при использовании pytest?
Ответ от нейросети
sobes.tech AI
Что хотят услышать интервьюеры:
Mock-объекты в pytest нужны, чтобы изолировать тестируемый код от внешних зависимостей: базы данных, HTTP, файловой системы, времени и т.д. Они позволяют проверить логику без реальных побочных эффектов и нестабильности. Важно показать понимание разницы между простым mock, stub и monkeypatch-подходами.
Определение:
Mock-объект — это подменный объект, который имитирует поведение реальной зависимости в тесте. С его помощью можно вернуть заранее заданный результат, проверить факт вызова, количество вызовов и аргументы, с которыми вызывались методы. В pytest mock-объекты часто используют через встроенный monkeypatch или через библиотеку unittest.mock, которая обычно хорошо сочетается с pytest.
Пример использования:
Допустим, функция получает пользователя через внешний сервис. В тесте не нужно реально ходить в сервис — достаточно подменить вызов и проверить результат.
# app.py
def get_user_name(api_client, user_id):
user = api_client.fetch_user(user_id)
return user["name"]
# test_app.py
from unittest.mock import Mock
from app import get_user_name
def test_get_user_name():
api_client = Mock()
api_client.fetch_user.return_value = {"name": "Alice"}
result = get_user_name(api_client, 123)
assert result == "Alice"
api_client.fetch_user.assert_called_once_with(123)
Пояснение кода:
В этом примере api_client — mock-объект, созданный через Mock().
Сначала задаётся поведение: fetch_user.return_value = {"name": "Alice"} — это означает, что при вызове метода тест получит поддельный ответ.
Затем вызывается тестируемая функция get_user_name(...), которая работает как будто с реальным клиентом.
После этого проверяется результат и факт вызова метода с нужным аргументом через assert_called_once_with(123).
Ключевые моменты:
- Mock-объекты используют для изоляции тестов от внешних систем и нестабильных зависимостей.
- Они помогают не только подменять результат, но и проверять взаимодействие: что, сколько раз и с какими аргументами было вызвано.
- В pytest часто используют
unittest.mock.Mock/MagicMock, а для точечной подмены —monkeypatch. - Mock нужен, когда важнее поведение тестируемого кода, а не реальная работа зависимости.
- Чрезмерное использование моков может сделать тесты хрупкими, поэтому их стоит применять там, где есть внешние эффекты или дорогие зависимости.