Как ты мокируешь зависимости в тестах: monkeypatch vs unittest.mock?
1️⃣ Как кратко ответить
Для мокирования зависимостей в тестах я использую unittest.mock для создания и управления фиктивными объектами, что позволяет изолировать тестируемый код. monkeypatch из библиотеки pytest применяю для временной замены атрибутов и объектов, что удобно для модификации глобальных состояний и конфигураций.
2️⃣ Подробное объяснение темы
Мокирование — это техника в тестировании, которая позволяет заменить реальные объекты или функции фиктивными (моками) для изоляции тестируемого кода. Это помогает сосредоточиться на тестировании конкретной функциональности без влияния внешних зависимостей.
unittest.mock
unittest.mock — это библиотека в Python, которая предоставляет инструменты для создания фиктивных объектов и функций. Она позволяет:
- Создавать моки, которые могут имитировать поведение реальных объектов.
- Задавать возвращаемые значения и побочные эффекты для методов моков.
- Проверять, как моки были вызваны в процессе тестирования.
Пример использования unittest.mock:
from unittest.mock import Mock
# Создаем мок-объект
mock_api = Mock()
# Задаем возвращаемое значение для метода
mock_api.get_data.return_value = {'key': 'value'}
# Используем мок в тестируемом коде
result = mock_api.get_data()
# Проверяем, что метод был вызван
mock_api.get_data.assert_called_once()
# Проверяем возвращаемое значение
assert result == {'key': 'value'}
Mock()создает новый мок-объект.mock_api.get_data.return_valueзадает возвращаемое значение для методаget_data.mock_api.get_data.assert_called_once()проверяет, что метод был вызван ровно один раз.
monkeypatch
monkeypatch — это функциональность, предоставляемая библиотекой pytest, которая позволяет временно изменять атрибуты и объекты. Это полезно для:
- Замены глобальных переменных или конфигураций.
- Изменения поведения модулей или классов на время выполнения теста.
Пример использования monkeypatch:
import pytest
# Функция, которую мы будем тестировать
def get_config_value():
return "original_value"
def test_get_config_value(monkeypatch):
# Замена возвращаемого значения функции
monkeypatch.setattr(__name__, 'get_config_value', lambda: "mocked_value")
# Проверяем, что функция возвращает новое значение
assert get_config_value() == "mocked_value"
monkeypatch.setattr()заменяет атрибут или функцию на новое значение или поведение.lambda: "mocked_value"задает новое поведение для функцииget_config_value.
Когда использовать
- Используйте
unittest.mock, когда нужно создать сложные моки с проверкой вызовов и управления поведением. - Применяйте
monkeypatchдля временной замены глобальных состояний или конфигураций, особенно в тестах сpytest.
Обе техники помогают изолировать тестируемый код, но выбор между ними зависит от контекста и требований теста.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться