← Назад ко всем вопросам

Как ты мокируешь зависимости в тестах: 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.

Обе техники помогают изолировать тестируемый код, но выбор между ними зависит от контекста и требований теста.

Тема: PyTest
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки