0

因此,尝试针对我的 Symfony 控制器编写单元测试,并遇到了这个问题。

我的控制器方法返回一个表单,我想检查该表单中的值以确保它符合预期。

  1. 我找不到任何方法来正确模拟表单生成器,
  2. 我不知道如何验证传递给它的值,即使我可以模拟它

这是我得到的(蒸馏)

$formBuilder = $this->getMock('Symfony\Component\Form\Tests\FormBuilderInterface',Array('add'));

$formFactory = $this->getMock('Symfony\Component\Form\FormFactoryInterface');

$formFactory
        ->expects($this->any())
        ->method('createBuilder')
        ->will($this->returnValue($formBuilder));

并设置,以便当 Symfony 从上下文中请求“form.factory”时,它会收到我的 $formBuilder。

然后在我的控制器中,一个简单的表格

$form = $this->createFormBuilder($task)
        ->add('CountryCode', 'text')
        ->add('State', 'text')
        ->add('Locality', 'text')
        ->add('OrganizationName', 'text')
        ->add('OrganizationalUnitName', 'text')
        ->add('CommonName', 'text')
        ->add('EmailAddress', 'text')
        ->add('company', 'text')
        ->add('save', 'submit')
        ->getForm();

我已经验证了对基本控制器的 CreateFormBuilder 调用实际上是返回了模拟的表单构建器接口,但是 add 方法不可用,这一切都被炸毁了

Fatal error: Call to a member function add() on a non-object 

这意味着我的表单生成器没有做正确的事情......

所以我看到了很多关于这个的讨论,但没有答案,除了“不要对你的控制器方法进行单元测试”,这不是一个很好的答案。Symfony 文档是关于对他们的 FormBuilder 功能进行单元测试的,这很奇怪...... http://symfony.com/doc/current/cookbook/form/unit_testing.html

4

1 回答 1

0

由于链接 formBuilders 'add' 方法,您将收到错误消息。您的模拟 formBuilder add 方法将需要返回自身。

$formBuilder->expects($this->any())
         ->method('add')
         ->will($this->returnSelf());
于 2013-10-03T00:06:03.753 回答