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/ сторонние библиотеки),

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

Работа по созданию реальной формы происходит внутри компоновщика, который в контексте этой спецификации типа формы является коллаборатором, а не реальным компоновщиком (а также не вашим кодом для тестирования).

Другие вопросы по тегам