それで、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