Мок-объект - это объект, который имитирует поведение реального объекта, заменяя его в тестах. Он позволяет изолировать тестируемый код от зависимостей, таких как базы данных, API или другие сервисы.
Использование:
Пример: Вместо реального подключения к базе данных, мок-объект может возвращать заранее определенные данные.
Мок-объект - это искусственный объект, который имитирует поведение реального объекта (например, класса, функции, или внешнего сервиса) для целей тестирования. Он используется, чтобы изолировать тестируемый код от зависимостей, которые могут быть непредсказуемыми, сложными в настройке, медленными или недоступными во время тестирования.
Зачем нужны мок-объекты?
Как использовать мок-объекты в тестах (пример с использованием `unittest.mock` в Python):
Предположим, у нас есть функция, которая использует внешний API для получения данных:
def get_data_from_api(api_client, endpoint):
"""Получает данные из API."""
response = api_client.get(endpoint)
if response.status_code == 200:
return response.json()
else:
raise Exception(f"API request failed with status code: {response.status_code}")
Чтобы протестировать эту функцию, мы можем использовать мок-объект для `api_client`:
import unittest
from unittest.mock import MagicMock
def get_data_from_api(api_client, endpoint):
"""Получает данные из API."""
response = api_client.get(endpoint)
if response.status_code == 200:
return response.json()
else:
raise Exception(f"API request failed with status code: {response.status_code}")
class TestGetDataFromApi(unittest.TestCase):
def test_get_data_from_api_success(self):
# Создаем мок-объект для api_client
mock_api_client = MagicMock()
# Настраиваем поведение мок-объекта:
mock_response = MagicMock()
mock_response.status_code = 200
mock_response.json.return_value = {"data": "some data"} # что возвращает response.json()
# Настраиваем возвращаемое значение mock_api_client.get(endpoint)
mock_api_client.get.return_value = mock_response
# Вызываем функцию, передавая ей мок-объект
result = get_data_from_api(mock_api_client, "/some/endpoint")
# Проверяем, что функция вернула ожидаемый результат
self.assertEqual(result, {"data": "some data"})
# Проверяем, что метод get был вызван с правильным аргументом
mock_api_client.get.assert_called_once_with("/some/endpoint")
def test_get_data_from_api_failure(self):
# Создаем мок-объект для api_client
mock_api_client = MagicMock()
# Настраиваем поведение мок-объекта:
mock_response = MagicMock()
mock_response.status_code = 500
# Настраиваем возвращаемое значение mock_api_client.get(endpoint)
mock_api_client.get.return_value = mock_response
# Вызываем функцию и проверяем, что она выбрасывает исключение
with self.assertRaisesRegex(Exception, "API request failed with status code: 500"):
get_data_from_api(mock_api_client, "/some/endpoint")
# Проверяем, что метод get был вызван с правильным аргументом
mock_api_client.get.assert_called_once_with("/some/endpoint")
if __name__ == '__main__':
unittest.main()
Основные методы и атрибуты `unittest.mock`:
Другие библиотеки для мокирования:
Важно: Мок-объекты следует использовать с осторожностью. Чрезмерное использование моков может привести к тому, что тесты будут проверять только детали реализации, а не поведение. Следует стараться фокусироваться на тестировании взаимодействия между модулями, а не на тестировании деталей реализации отдельных модулей.