Этот вопрос проверяет умение изолировать тесты от внешних HTTP-зависимостей, что необходимо для создания быстрых, стабильных и воспроизводимых unit-тестов.
Мокирование HTTP-клиентов — ключевая практика в модульном тестировании кода, который взаимодействует с внешними API или сервисами. Вместо реальных сетевых вызовов, которые могут быть медленными, неустойчивыми или требующими авторизации, мы подменяем клиент на объект-заглушку. Этот объект имитирует интерфейс реального клиента, но возвращает заранее подготовленные, детерминированные ответы.
nock для Node.js и fetch-mock или msw (Mock Service Worker) для браузерных сред. В Python часто применяют responses для библиотеки requests или aioresponses для aiohttp.Jest для JavaScript) предоставляют утилиты для мока модулей, включая модули, экспортирующие HTTP-клиенты.Рассмотрим функцию, которая получает данные пользователя с внешнего API. Мы протестируем её, замокав библиотеку requests с помощью unittest.mock.
import requests
from unittest.mock import Mock, patch
def get_user_data(user_id):
"""Функция, которую мы тестируем."""
response = requests.get(f'https://api.example.com/users/{user_id}')
if response.status_code == 200:
return response.json()
return None
# Тест с использованием мока
@patch('requests.get') # Декоратор подменяет requests.get на мок
def test_get_user_data_success(mock_get):
# 1. Настраиваем мок: какой ответ должен вернуться
mock_response = Mock()
mock_response.status_code = 200
mock_response.json.return_value = {'id': 123, 'name': 'John'}
mock_get.return_value = mock_response
# 2. Вызываем тестируемую функцию
result = get_user_data(123)
# 3. Проверяем, что функция вернула ожидаемые данные
assert result == {'id': 123, 'name': 'John'}
# 4. Проверяем, что запрос был выполнен с правильным URL
mock_get.assert_called_once_with('https://api.example.com/users/123')
В этом примере декоратор @patch временно заменяет requests.get на объект-мок. Мы настраиваем этот мок так, чтобы он возвращал фиктивный ответ с нужным статусом и данными. Это позволяет проверить логику функции get_user_data без реального сетевого запроса.
Моки HTTP особенно полезны в unit-тестах, интеграционных тестах (для изоляции тестируемого сервиса) и при разработке, когда внешний API ещё не готов или недоступен. Они также позволяют легко тестировать обработку ошибок сети (например, таймауты или коды 5xx), симулируя такие сценарии.
Вывод: Мокать HTTP-клиенты стоит всегда, когда вы пишете тесты, которые не должны зависеть от внешней сети. Это делает тестовый набор быстрым, надёжным и независимым от состояния внешних систем, что является краеугольным камнем качественного CI/CD-процесса.