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 в коде теста до его использования, чтобы не вызывать механизм автозагрузки (вы ведь его используете?).
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы