2014-07-02 2 views
0

Я хочу протестировать типы форм из Symfony2. У меня есть пользовательский тип формы и мой тест выглядит следующим образом:PHPSpec 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, []); 
} 

И я получаю: Фатальная ошибка: Вызов функции члена оных() на не-объект в методе buildForm я призываю $ this-> добавить метод из FormBuilderInterface, как я могу это решить?

ответ

4

Вы не разместили свой код формы, но я подозреваю, что проблема заключается в свободном интерфейсе, который использует метод add() строителя. Если у вас есть несколько вызовов, чтобы добавить(), как это:

$builder 
    ->add('username') 
    ->add('email') 
    ->add(...) 
    ->add(...) 
    ->add('save', 'submit'); 

Тогда проблема будет происходить после первого дополнения(), потому что не возвращает объект (отсюда и «Обращение к функции-члена оной () на сообщение об ошибке "non-object").

Если вы используете беглый стиль, вам нужно «поезд» за $ строитель сотрудник, так что phpspec/издевательство может возвращать один и тот же объект строитель для последовательных вызовов, чтобы добавить():

$builder->add(Argument::any(), Argument::any())->willReturn($builder); 
$this->buildForm($builder, []); 

I что формы Symfony 2 могут быть не лучшим кандидатом для тестирования phpspec, так как вы действительно хотите протестировать только общедоступный API для своих классов, а не тестировать собственный код (т. е. фреймворки/сторонние библиотеки).

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

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

Смежные вопросы