因此,尝试针对我的 Symfony 控制器编写单元测试,并遇到了这个问题。
我的控制器方法返回一个表单,我想检查该表单中的值以确保它符合预期。
- 我找不到任何方法来正确模拟表单生成器,
- 我不知道如何验证传递给它的值,即使我可以模拟它
这是我得到的(蒸馏)
$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