Функциональное тестирование Symfony2: Требуется база данных или нет?


Мне нужно написать функциональные тесты для контроллера, который регистрирует пользователя в приложении.

Контроллер имеет два метода (и маршрута):

  • registrationAction (маршрут=регистрация)
  • endAction (маршрут= регистрация/окончание)

Теперь я хотел бы написать функциональные тесты для этих двух методов.

Мой вопрос: поскольку контроллер создает и сохраняет нового пользователя в базе данных, должен ли я использовать тестовую базу данных? Является ли издевательство над менеджером сущностей решение? И как я могу проверить, что пользователь правильно создан в базе данных?

Документация Symfony, говоря о функциональном тестировании форм, не упоминает базу данных, но в целом заполнение формы и ее отправку. Но если я попытаюсь сделать то же самое в своих функциональных тестах, они вернут ошибки (и я думаю, что они правы: нет базы данных, где можно сохранить отправленные данные!).

Итак, я думаю, что мне следует использовать базу данных для функциональных тестов, но я не понимаю, почему:

  1. В документации Symfony не упоминается база данных
  2. Кто-то предлагает использовать насмешки Менеджера сущностей.

Я немного в замешательстве: должен ли я использовать базу данных или нет?

Author: Aerendir, 2015-06-12

1 answers

Ответ на этот вопрос не прост yes/no, вы можете сделать это обоими способами, у обоих есть свои преимущества и недостатки.

1. С тестовой базой данных

Вы упомянули, что вам нужно написать тест контроллера. Контроллер тестирования - это тестирование почти верхнего уровня потока вашего приложения. Контроллер зависит от многих реализаций классов, которые вам нужно будет имитировать, если вы хотите протестировать логику своих контроллеров с изоляцией. Если у вашего контроллера есть зависимости, введенные в конструктор с использованием service container, я бы, возможно, подумал о насмешке, но если это расширит Controller Symfony Я бы использовал тестовую базу данных, издеваясь над всем, что в этом случае было бы жестоко.

2. Без базы данных

В этом случае вам нужно поиздеваться над своим entity manager, и это возможно. Однако в вашем случае я бы подумал о рефакторинге. Переместите логику за пределы вашего контроллера в какой-нибудь UserManager или аналогичный класс. Зарегистрируйте этот класс в качестве службы и введите все необходимые зависимости. Подумайте о внедрении репозитория вместо всего EntityManager, как описано здесь. Теперь, поскольку ваш код более ответственен, вам проще писать тесты и легче имитировать все ваши зависимости.

Вывод: выполните рефакторинг, переместите свою логику за пределы контроллера, напишите тест для одного ответственного класса, добавив в него множество зависимостей.

 4
Author: Tomasz Madeyski, 2015-06-12 10:20:10