Типы форм 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, как я могу это решить?


person Thomas    schedule 02.07.2014    source источник


Ответы (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 для своих классов, а не тестировать код, которым вы не владеете (например, фреймворк/сторонние библиотеки) .

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

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

person Damon Jones    schedule 03.07.2014