PHPSpec symfony2表单类型

时间:2014-07-02 08:10:54

标签: symfony 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, []);
}

我得到:致命错误:在非对象上调用成员函数add()在buildForm方法中,我调用$ this->从FormBuilderInterface中添加方法如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

您没有发布您的表单代码,但我怀疑问题是构建器的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 / 3rd-党的图书馆)。

您正在测试的表单类型不是生成的实际表单,它更像是在需要时用于构建表单的“蓝图”,因此我认为测试表单具有某些字段更难或者选项等,因为代码不会调用它,它会在表单框架处理表单类型时自动发生。

创建真实表单的工作发生在构建器中,在此表单类型规范的上下文中是协作者而不是真正的构建器对象(也不是您要测试的代码)。