Sobes.tech
Назад к вопросам
Junior — Middle
49

Можете ли вы объяснить, что подразумевается под mock-объектами при использовании pytest?

Компании, где спрашивали
Медси
РунитиРунити
Леста

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

sobes.tech AI

Что хотят услышать интервьюеры:

Mock-объекты в pytest нужны, чтобы изолировать тестируемый код от внешних зависимостей: базы данных, HTTP, файловой системы, времени и т.д. Они позволяют проверить логику без реальных побочных эффектов и нестабильности. Важно показать понимание разницы между простым mock, stub и monkeypatch-подходами.

Определение:

Mock-объект — это подменный объект, который имитирует поведение реальной зависимости в тесте. С его помощью можно вернуть заранее заданный результат, проверить факт вызова, количество вызовов и аргументы, с которыми вызывались методы. В pytest mock-объекты часто используют через встроенный monkeypatch или через библиотеку unittest.mock, которая обычно хорошо сочетается с pytest.

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

Допустим, функция получает пользователя через внешний сервис. В тесте не нужно реально ходить в сервис — достаточно подменить вызов и проверить результат.

# app.py
def get_user_name(api_client, user_id):
    user = api_client.fetch_user(user_id)
    return user["name"]
# test_app.py
from unittest.mock import Mock
from app import get_user_name

def test_get_user_name():
    api_client = Mock()
    api_client.fetch_user.return_value = {"name": "Alice"}

    result = get_user_name(api_client, 123)

    assert result == "Alice"
    api_client.fetch_user.assert_called_once_with(123)

Пояснение кода:

В этом примере api_client — mock-объект, созданный через Mock().
Сначала задаётся поведение: fetch_user.return_value = {"name": "Alice"} — это означает, что при вызове метода тест получит поддельный ответ.
Затем вызывается тестируемая функция get_user_name(...), которая работает как будто с реальным клиентом.
После этого проверяется результат и факт вызова метода с нужным аргументом через assert_called_once_with(123).

Ключевые моменты:

  • Mock-объекты используют для изоляции тестов от внешних систем и нестабильных зависимостей.
  • Они помогают не только подменять результат, но и проверять взаимодействие: что, сколько раз и с какими аргументами было вызвано.
  • В pytest часто используют unittest.mock.Mock/MagicMock, а для точечной подмены — monkeypatch.
  • Mock нужен, когда важнее поведение тестируемого кода, а не реальная работа зависимости.
  • Чрезмерное использование моков может сделать тесты хрупкими, поэтому их стоит применять там, где есть внешние эффекты или дорогие зависимости.