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) а их конкретные результаты я проверю, когда буду тестировать отдельно каждый класс и когда буду тестировать приложение на "уровне браузера". Верно?
Как проверить что в методе были вызваны именно нужные функции в нужном порядке?
Я так понял, что не могу использовать мок объекты, так как у меня синелтон?
  • Вопрос задан
  • 3068 просмотров
Пригласить эксперта
Ответы на вопрос 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 в коде теста до его использования, чтобы не вызывать механизм автозагрузки (вы ведь его используете?).
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы