Ответ
Mock-объекты (моки) — это «поддельные» объекты, которые имитируют поведение реальных зависимостей в изолированной среде unit-тестирования. Они позволяют контролировать и проверять взаимодействие между компонентами системы.
Ключевые цели использования моков:
- Изоляция компонента: Тестируется только целевой код, без влияния внешних систем (базы данных, API, файловой системы).
- Эмуляция поведения: Можно имитировать любые сценарии, включая трудновоспроизводимые, например, ошибки сети, таймауты или специфические ответы от API.
- Проверка взаимодействий (верификация): Можно убедиться, что тестируемый код правильно вызывает методы своих зависимостей с нужными аргументами.
- Ускорение тестов: Исключение медленных операций (например, сетевых запросов) делает выполнение тестов практически мгновенным.
Пример с unittest.mock
в Python:
Предположим, у нас есть функция, которая получает данные пользователя из базы данных.
from unittest.mock import Mock
# 1. Создаем mock-объект, имитирующий подключение к БД
mock_db_connection = Mock()
# 2. Настраиваем его поведение: при вызове get_user(1) он должен вернуть словарь
mock_db_connection.get_user.return_value = {"id": 1, "name": "Test User"}
# 3. Тестируемый код использует mock вместо реальной БД
user = mock_db_connection.get_user(1)
# 4. Проверяем результат
assert user["name"] == "Test User"
# 5. Проверяем, что метод был вызван ровно один раз с аргументом 1
mock_db_connection.get_user.assert_called_once_with(1)