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

Опишите свой опыт использования мок-объектов в тестировании

Компании, где спрашивали
Pashapay

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

sobes.tech AI

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

Важно понять, умеет ли кандидат изолировать тестируемый код от внешних зависимостей и объяснить, зачем это нужно. Хороший ответ показывает, что мок-объекты используются для контроля входных данных, проверок вызовов и ускорения тестов. Также ожидают понимание разницы между mock, stub и fake на базовом уровне.

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

Мок-объект — это тестовый объект, который заменяет реальную зависимость и позволяет управлять её поведением в тесте. С его помощью можно заранее задать ответ зависимости и проверить, как код взаимодействует с ней. Это полезно, когда реальный сервис недоступен, медленный или его использование нежелательно в unit-тестах.

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

Например, есть сервис оформления заказа, который отправляет письмо через email-отправщик. В тесте не нужно реально отправлять письмо, поэтому email-отправщик заменяют мок-объектом и проверяют, что метод отправки был вызван с нужными параметрами.

from unittest.mock import Mock

class OrderService:
    def __init__(self, email_sender):
        self.email_sender = email_sender

    def place_order(self, user_email):
        # логика оформления заказа
        self.email_sender.send(
            user_email,
            "Order confirmed"
        )

def test_place_order_sends_email():
    email_sender = Mock()
    service = OrderService(email_sender)

    service.place_order("user@example.com")

    email_sender.send.assert_called_once_with(
        "user@example.com",
        "Order confirmed"
    )

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

Код показывает изоляцию бизнес-логики от внешней зависимости.

Сначала создаётся Mock() вместо реального email_sender. Затем OrderService получает этот мок через внедрение зависимости. После вызова place_order() тест не проверяет реальную отправку письма, а проверяет факт вызова метода send() и его аргументы. Это позволяет тестировать только поведение OrderService, не затрагивая внешнюю инфраструктуру.

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

  • Моки нужны для изоляции unit-тестов от внешних систем: БД, HTTP, очередей, почты.
  • С их помощью можно проверять не только результат, но и взаимодействие: какой метод вызвали, сколько раз и с какими аргументами.
  • Моки делают тесты быстрее, стабильнее и проще в отладке.
  • Их важно использовать там, где реальная зависимость мешает тестировать логику, а не заменять ими всё подряд.
  • Для собеседования полезно уметь отличать mock от stub: stub возвращает заранее заданные данные, mock ещё и проверяет вызовы.