Назад к вопросам
Junior
140
questionbank

Что такое мокирование (mocking) в контексте тестирования?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Мокирование – это создание объектов-заглушек (mock objects), которые имитируют поведение реальных зависимостей тестируемого объекта. Это делается для изоляции тестируемого компонента и проверки его логики без взаимодействия с внешними подсистемами (базами данных, сетевыми сервисами и т.д.). Моки позволяют контролировать возвращаемые значения и исключения, а также проверять, как тестируемый объект взаимодействует со своими зависимостями (были ли вызваны определенные методы с определенными аргументами).

Зачем нужно мокирование:

  • Изоляция: Тестируется только логика рассматриваемого компонента.
  • Скорость: Мокирование зависимостей позволяет выполнять тесты быстро, без ожидания ответов от внешних сервисов.
  • Надежность: Тесты не зависят от состояния внешних систем, что делает их более стабильными.
  • Тестирование граничных случаев: Легко имитировать ошибки или неожидаемое поведение зависимостей.

Популярные библиотеки для мокирования в Python:

  • unittest.mock: Встроенный в стандартную библиотеку модуль.
  • pytest-mock: Плагин для pytest, предоставляющий удобный фикстур mocker.

Пример использования unittest.mock:

# Исходный код
class Service:
    def get_data(self):
        # Запрос к внешнему сервису
        pass

class Processor:
    def __init__(self, service):
        self._service = service

    def process(self):
        data = self._service.get_data()
        return f"Обработано: {data}"

# Мокирование для тестирования Processor
import unittest
from unittest.mock import Mock

class TestProcessor(unittest.TestCase):
    def test_process_calls_service(self):
        # Создаем мок для Service
        mock_service = Mock()
        # Указываем, какое значение должен возвращать get_data
        mock_service.get_data.return_value = "Тестовые данные"

        # Создаем тестируемый объект с моком
        processor = Processor(mock_service)
        result = processor.process()

        # Проверяем, что метод get_data был вызван
        mock_service.get_data.assert_called_once()
        # Проверяем результат
        self.assertEqual(result, "Обработано: Тестовые данные")

if __name__ == '__main__':
    unittest.main()