Pull to refresh

Comments 5

А что делать, если мой бандловый контроллер использует сервисы и репозитории из «родительского» приложения? Я экстрактировал интерфейсы из этих сервисов и репозиториев и сложил их в отдельный Composer пакет, который в свою очередь рекуайрится и в «родительское» приложение, и в бандл. Соответственно, бандл программируется к этим интерфейсам. И в составе всего приложения бандл работает прекрасно. А как теперь протестировать это в изолированном состоянии в бандле? Ибо при запуске тестов получаем:
Symfony\Component\DependencyInjection\Exception\RuntimeException: Cannot autowire service «bundle_controller_service_id»: argument "$eventStore" of method «My\Bundle\Namespace\CallbackController::__construct()» references interface «Vendor\Contracts\BundleEventStoreInterface» but no such service exists. Did you create a class that implements this interface?

Можно в приложении для тестов сделать mock-реализации интерфейсов (ничего не делающие по факту или отдающие "болваночные" данные, но реализующие контракт интерфейса) от которых зависит ваш бандл.

Но в таком случае, как я понимаю, нужно 1) отключить autowiring в бандловом services.xml, 2) явно указать mock-реализации как argument для моего бандлового сервиса, 3) добавить интерфейсы как alias'ы для mock-реализаций. Но что в таком случае произойдет после компиляции контейнера, когда бандл будет установлен в приложение и подгрузится бандловый же services.xml? Алиасы для интерфейсов будут же указывать на mock-реализации! Или для тестов нужен какой-то отдельный services.xml?

Тут в статье расписан же процесс: вы для запуска тестов делаете прямо в бандле в папке tests отдельное микроприложение из нескольких файлов, со своим контейнером и его конфигурацией. В его контейнере вы можете вашему интерфейсу назначить конкретную мок-реализацию, аналогично тому как вы назначаете реализацию в обычном приложении. Интерфейсы же для этого и созданы: чтобы вы с легкостью могли его подменить для нужного кейса нужной реализацией.

Да, сорри, чот затупил. Спасибо!
Sign up to leave a comment.

Articles