Опишите свой опыт использования мок-объектов в тестировании
Ответ от нейросети
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 ещё и проверяет вызовы.