Ответы пользователя по тегу PHPUnit
  • Какой смысл mock объектов для юнит тестирования своего кода?

    Отрывок из книги.
    Одной из важных особенностей unit-тестирования является тестирование в
    изоляции. Unit (класс, функция или другой модуль) должен быть изолирован
    от всего остального мира.Это будет гарантировать, что тест тестирует только
    этот модуль. Тест может упасть только по двум причинам: неправильный тест
    или неправильный код тестируемого модуля. Тестирование в изоляции даёт
    нам эту простоту и быстродействие

    Обычно зависимость - это интерфейс, который имеет несколько реализа-
    ций. Использование реальных реализаций этого интерфейса во время unit-
    тестирования - плохая идея, поскольку там могут проводиться те самые опера-
    ции ввода-вывода, замедляющие тестирование и не дающие провести тести-
    рование этого модуля в изоляции. Прогон unit-тестов должен быть быстр как
    молния, поскольку запускаться они будут часто и важно, чтобы разработчик
    запустив их не потерял фокус над кодом. Написал код - прогнал тесты, еще
    написал код - прогнал тесты. Быстрые тесты позволят ему оставаться более
    продуктивным, не позволяя отвлекаться. Решение в лоб задачи изоляции
    класса от зависимостей - создание отдельной реализации этого интерфейса,
    предназначенного просто для тестирования.

    Так вот суть в том, чтобы точечно проверить текущий класс на его функциональность. Моки удодно делать на основе общего интерфейса. Всё мокать не нужно. Но если ваш класс работает с апи, бд, большим обьемом данных. То такая зависимость это плохо.
    Цель теста проверить текущий класс на соответствие требований. А какие данные настоящие или фейк это не важно.

    К примеру есть класс Заказ. Нам нужно его тестировать. У него есть зависимости: Налог и прочее. Класс налога может быть класс, который получает Значение по api. Так вот есть смысл при тестировании Заказа создать мок Налога
    $tax = $this->createMock(Tax::class);
    $tax->method('calculateTax')
    ->willReturn(0);
    
    $newOrder = new Order($tax);

    Дальше идут тесты класс Order. Они будут изолированные. Есть основной класс, который ты тестируешь. Для него ты Мок не создаешь. А вот для классов с зависимостями создаются Моки, но не всегда. Если класс зависимостей например содержит просто константы. То создавать Мок и дублировать код смысла нет
    Ответ написан
    Комментировать