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

Могли бы вы объяснить, что такое Mock и в каких случаях его используют в тестировании?

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

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

sobes.tech AI

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

Mock — это тестовый объект, который подменяет реальную зависимость и позволяет проверить взаимодействие с ней. Его используют, когда нужно изолировать тестируемый код от БД, сети, файловой системы или других внешних сервисов. Важная часть — возможность не только вернуть нужные данные, но и проверить, что зависимость была вызвана ожидаемым образом.

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

Mock — это подставной объект в тестах, который имитирует поведение реальной зависимости и фиксирует обращения к себе. В отличие от простого stub, mock обычно применяют, чтобы проверить не только результат работы кода, но и факт вызовов: сколько раз, с какими параметрами и в каком порядке.

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

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

public interface IEmailSender
{
    void Send(string to, string subject, string body);
}

public class OrderService
{
    private readonly IEmailSender _emailSender;

    public OrderService(IEmailSender emailSender)
    {
        _emailSender = emailSender;
    }

    public void PlaceOrder(string customerEmail)
    {
        // логика оформления заказа
        _emailSender.Send(customerEmail, "Order confirmed", "Your order was placed");
    }
}

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

Код показывает зависимость IEmailSender, которую OrderService получает через конструктор. Это удобно для тестирования: вместо реальной отправки письма можно подставить mock-реализацию.

Пошагово:

  1. Создаётся OrderService с поддельным IEmailSender.
  2. Вызывается PlaceOrder(...).
  3. Тест проверяет, что Send(...) был вызван с ожидаемыми аргументами.
  4. Реальная отправка письма при этом не происходит.

Если бы использовался настоящий email-сервис, тест стал бы медленнее, нестабильнее и зависел бы от внешней инфраструктуры.

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

  • Mock помогает изолировать код от внешних зависимостей.
  • Его используют для проверки взаимодействия: вызовов, аргументов и количества обращений.
  • Особенно полезен для БД, HTTP-клиентов, очередей, файлов и email-сервисов.
  • Mock делает тесты быстрее, стабильнее и предсказуемее.
  • В C# mock-объекты часто создают с помощью библиотек вроде Moq или NSubstitute.
  • Mock не заменяет полноценные интеграционные тесты: он решает задачу unit-тестирования.