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 に答える