Задать вопрос
DenisOgr
@DenisOgr
Developer

Phpunit — как это тестировать?

Новичок в тестировании.

Есть приложение. Использует сингелто (методы A::getMainApp(), чтобы вернуть объект приложения).

В тестируемом классе есть метод:
protected function endApp()
    {
        $logger = new MainLogger();
        $logger->log();

        $this->response->send();
        exit(0);
    }

который "цепляет" два класса(MainLogger, ResponseManager ($this->response)), которые в свою очередь могут цеплять в еще другие классы.

В данном тесте мне не нужно "эмулировать и создавать" все нужные классы?
Мне в принципе нужно протестить, что был вызван метод log(), response->send() и exit(0) а их конкретные результаты я проверю, когда буду тестировать отдельно каждый класс и когда буду тестировать приложение на "уровне браузера". Верно?
Как проверить что в методе были вызваны именно нужные функции в нужном порядке?
Я так понял, что не могу использовать мок объекты, так как у меня синелтон?
  • Вопрос задан
  • 3069 просмотров
Подписаться 4 Оценить Комментировать
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 2
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
вы не можете использовать mock так как у вас инстанцирование класса MainLogger происходит прямо в функции endApp(). Что бы это обойти, передавайте MainLogger в конструктор класса содержащего этот метод, и в тестах просто подменяйте на мок.

По поводу exit - тут только если тестами уровня приложения тестить, юнит тесты такое не покрывают. Ну и опять же делать exit внутри какого-то метода не так уж и хорошо.

Либо же приведенный вами код не раскрывает что у вас и как, ибо описание с кодом расходится. Почитайте вообще про S.O.L.I.D. и в частности про Dependency Inversion.
Ответ написан
Если дизайн класса (очень неудачный не только в плане тестирования) изменить нельзя, то смотрите в сторону https://github.com/php-test-helpers/php-test-helpers - как раз полностью ваш случай: переопределение загрузки класса и переопределение exit. Плюс для тестирования защищенного метода нужно будет использовать отражение, если публичными методами без оверхида не вызывать защищенный.

Если бы не потребность в тестировании вызова exit, то с большой вероятностью можно было бы обойтись просто описанием "тупого" класса MainLogger в коде теста до его использования, чтобы не вызывать механизм автозагрузки (вы ведь его используете?).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽