PHPSpec symfony2表格类型

PHPSpec symfony2表格类型,symfony,phpspec,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

我想测试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, []);
}
$builder
    ->add('username')
    ->add('email')
    ->add(...)
    ->add(...)
    ->add('save', 'submit');

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

您没有发布表单代码,但我怀疑问题在于构建器的add()方法使用的流畅接口。如果有多个像这样的add()调用:

/**
 * @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, []);
}
$builder
    ->add('username')
    ->add('email')
    ->add(...)
    ->add(...)
    ->add('save', 'submit');
然后,在第一个add()之后,问题就会出现,因为它没有返回对象(因此出现了“对非对象调用成员函数add()”的错误消息)

如果您使用的是fluent样式,则需要“训练”$builder协作者,以便phpspec/mockery可以为要添加()的连续调用返回相同的生成器对象:

我认为Symfony 2表单可能不是phpspec测试的最佳候选,因为您确实希望只测试类的公共API,而不是测试您不拥有的代码(即框架/第三方库)

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


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

您没有发布表单代码,但我怀疑问题在于构建器的add()方法使用的流畅接口。如果有多个像这样的add()调用:

/**
 * @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, []);
}
$builder
    ->add('username')
    ->add('email')
    ->add(...)
    ->add(...)
    ->add('save', 'submit');
然后,在第一个add()之后,问题就会出现,因为它没有返回对象(因此出现了“对非对象调用成员函数add()”的错误消息)

如果您使用的是fluent样式,则需要“训练”$builder协作者,以便phpspec/mockery可以为要添加()的连续调用返回相同的生成器对象:

我认为Symfony 2表单可能不是phpspec测试的最佳候选,因为您确实希望只测试类的公共API,而不是测试您不拥有的代码(即框架/第三方库)

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

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