PHPSpec symfony2 Типы форм
Я хочу протестировать типы форм из Symfony2. У меня есть пользовательский тип формы, и мой тест выглядит следующим образом:
/**
* @param \Acme\UserBundle\Entity\User $user
*/
function let(\Acme\UserBundle\Entity\User $user)
{
$this->beConstructedWith($user);
}
function it_is_initializable()
{
$this->shouldHaveType('Acme\UserBundle\Form\Type\RegistrationFormType');
}
/**
* @param \Symfony\Component\Form\FormBuilderInterface $builder
*/
function it_builds_form(\Symfony\Component\Form\FormBuilderInterface $builder)
{
$this->buildForm($builder, []);
}
И я получаю: Неустранимая ошибка: вызов функции-члена add() для необъекта. В методе buildForm я вызываю метод $this->add из FormBuilderInterface, как я могу решить эту проблему?
1 ответ
Вы не опубликовали свой код формы, но я подозреваю, что проблема в свободном интерфейсе, который использует метод add(). Если у вас есть несколько вызовов add(), как это:
$builder
->add('username')
->add('email')
->add(...)
->add(...)
->add('save', 'submit');
Тогда проблема возникнет после первого add(), потому что это не возвращает объект (следовательно, сообщение об ошибке "Вызов функции-члена add() для не-объекта").
Если вы используете свободный стиль, вам нужно "обучить" соавтора $builder, чтобы phpspec/mockery мог возвращать один и тот же объект построителя для последовательных вызовов add():
$builder->add(Argument::any(), Argument::any())->willReturn($builder);
$this->buildForm($builder, []);
Я думаю, что формы Symfony 2, возможно, не лучший кандидат для тестирования phpspec, так как вы действительно хотите тестировать только общедоступный API для ваших классов, а не тестировать код, который вам не принадлежит (например, framework/ сторонние библиотеки),
Тип формы, который вы тестируете, не является фактически созданной формой, это больше похоже на "чертеж", используемый для создания формы, когда она необходима, поэтому я думаю, что сложнее проверить, что форма имеет определенные поля или параметры, и т.д., поскольку это не вызывается вашим кодом, это происходит автоматически, когда фреймворк форм обрабатывает тип формы.
Работа по созданию реальной формы происходит внутри компоновщика, который в контексте этой спецификации типа формы является коллаборатором, а не реальным компоновщиком (а также не вашим кодом для тестирования).