Функциональное тестирование Symfony2: Требуется база данных или нет?
Мне нужно написать функциональные тесты для контроллера, который регистрирует пользователя в приложении.
Контроллер имеет два метода (и маршрута):
-
registrationAction
(маршрут=регистрация) -
endAction
(маршрут= регистрация/окончание)
Теперь я хотел бы написать функциональные тесты для этих двух методов.
Мой вопрос: поскольку контроллер создает и сохраняет нового пользователя в базе данных, должен ли я использовать тестовую базу данных? Является ли издевательство над менеджером сущностей решение? И как я могу проверить, что пользователь правильно создан в базе данных?
Документация Symfony, говоря о функциональном тестировании форм, не упоминает базу данных, но в целом заполнение формы и ее отправку. Но если я попытаюсь сделать то же самое в своих функциональных тестах, они вернут ошибки (и я думаю, что они правы: нет базы данных, где можно сохранить отправленные данные!).
Итак, я думаю, что мне следует использовать базу данных для функциональных тестов, но я не понимаю, почему:
- В документации Symfony не упоминается база данных
- Кто-то предлагает использовать насмешки Менеджера сущностей.
Я немного в замешательстве: должен ли я использовать базу данных или нет?
1 answers
Ответ на этот вопрос не прост yes
/no
, вы можете сделать это обоими способами, у обоих есть свои преимущества и недостатки.
1. С тестовой базой данных
Вы упомянули, что вам нужно написать тест контроллера. Контроллер тестирования - это тестирование почти верхнего уровня потока вашего приложения. Контроллер зависит от многих реализаций классов, которые вам нужно будет имитировать, если вы хотите протестировать логику своих контроллеров с изоляцией. Если у вашего контроллера есть зависимости, введенные в конструктор с использованием service container
, я бы, возможно, подумал о насмешке, но если это расширит Controller
Symfony Я бы использовал тестовую базу данных, издеваясь над всем, что в этом случае было бы жестоко.
2. Без базы данных
В этом случае вам нужно поиздеваться над своим entity manager
, и это возможно. Однако в вашем случае я бы подумал о рефакторинге. Переместите логику за пределы вашего контроллера в какой-нибудь UserManager
или аналогичный класс. Зарегистрируйте этот класс в качестве службы и введите все необходимые зависимости. Подумайте о внедрении репозитория вместо всего EntityManager, как описано здесь. Теперь, поскольку ваш код более ответственен, вам проще писать тесты и легче имитировать все ваши зависимости.
Вывод: выполните рефакторинг, переместите свою логику за пределы контроллера, напишите тест для одного ответственного класса, добавив в него множество зависимостей.