PHPSpec symfony2表单类型



我想从Symfony2测试表单类型。我有一个自定义表单类型,我的测试看起来像这样:

/**
 * @param  AcmeUserBundleEntityUser $user
 */
function let(AcmeUserBundleEntityUser $user)
{
    $this->beConstructedWith($user);
}
function it_is_initializable()
{
    $this->shouldHaveType('AcmeUserBundleFormTypeRegistrationFormType');
}
/**
 * @param SymfonyComponentFormFormBuilderInterface $builder
 */
function it_builds_form(SymfonyComponentFormFormBuilderInterface $builder)
{
    $this->buildForm($builder, []);
}

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

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

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

那么问题将发生在第一个add()之后,因为它没有返回一个对象(因此出现"调用成员函数add()对一个非对象"的错误消息)。

如果你使用的是流畅风格,你需要"训练"$builder合作者,这样phpspec/mock就可以在连续调用add()时返回相同的builder对象:

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

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

你正在测试的表单类型不是实际产生的表单,它更像是用于在需要时构建表单的"蓝图",所以我认为很难测试表单是否有某些字段或选项等,因为这不是由你的代码调用,它会在表单框架处理表单类型时自动发生。

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

相关内容

  • 没有找到相关文章

最新更新