2016-09-05 6 views
7

私はZendでPHPUnitを使用し始めています。これらのテストがどのように機能するかを理解するのに少し助けが必要です。Zend 2:フォームクラスのユニットテスト

POSTパラメータを渡さないと、フォームからエラーメッセージが返されたかどうかをテストします。

問題は、私は次のエラーを取得する私のフォームから一つのフィールドはDoctrineのDoctrineModule\Form\Element\ObjectSelect

... 
    $this->add(array(
     'type' => 'DoctrineModule\Form\Element\ObjectSelect', 
     'name' => 'user', 
     'attributes' => array(
      'id' => 'user-label', 
     ), 
     'options' => array(
      'object_manager' => $em, 
      'target_class' => 'Application\Entity\User', 
      'property' => 'username', 
      'label' => 'User:', 
      'display_empty_item' => true, 
      'empty_item_label' => '---', 
      'label_generator' => function($entity) { 
       return $entity->getUsername(); 
      }, 
     ), 
    )); 
    ... 

を使用していることである。
Fatal error: Call to a member function getIdentifierFieldNames() on null

私は嘲笑オブジェクトでこのフィールドを上書きしようとした、しかし、Zendが」doesnのt objectstypeで、クラス名(string)を許可するので、このコードは機能しません。

public function testIfFormIsValid() 
{ 
    $objectSelect = $this->getMockBuilder('DoctrineModule\Form\Element\ObjectSelect') 
     ->disableOriginalConstructor() 
     ->getMock(); 
    $objectSelect->expects($this->any()) 
     ->method('getValueOptions') 
     ->will($this->returnValue(array())); 

    $form = new \AppModuleComment\Form\Comment('form', array(
     'em' => $this->em // Mocked object 
    )); 
    $form->add(array(
     'type' => $objectSelect, 
     'name' => 'user', 
     'attributes' => array(
      'id' => 'user-label', 
     ), 
     'options' => array(
      'object_manager' => $this->em, 
      'target_class' => 'Application\Entity\User', 
      'property' => 'username', 
      'label' => 'User:', 
      'display_empty_item' => true, 
      'empty_item_label' => '---', 
      'label_generator' => function($entity) { 
       return $entity->getUsername(); 
      }, 
     ), 
    )); 

    $data = array(
     'id' => null, 
     'user' => null 
    ); 

    $form->setData($data); 
    $this->assertTrue($form->isValid(), 'Form is not valid'); 
}  

私は間違っていますか?どのようにそのようなコードをテストすべきですか?

答えて

1

あなたのコードではなく、ZendやDoctrine(あるいはその両方)の機能をテストしているようです。ライブラリを使用する場合は、これらのライブラリを信頼する必要があります。

何が起こるか:Form\Form::add()Form\Factory::create()を使用して配列から要素を作成します。 Form\Factory::create()Form\FormElementManager::get()を使用して、指定された型から要素を取得します。

タイプがオブジェクトで、Form\FormElementManager::get()がオブジェクトを処理できないため、スクリプトは失敗します。 はObjectSelect::valid()を呼び出しますが、値がnullであるかどうかは検証されません。 Doctrine/Zendのコードはあなたのものではありません。それをテストしないでください。

Doctrines ObjectSelectの中から選択した結果を模擬したいときに、もっと興味深いものになります。しかしそれは別の質問です。

+0

私はどのようにテストする必要があります誰かが空のフォームを送信した場合、フォームから検証メッセージが返されますか?または、ユーザーが正しいデータを入力してもフォームが有効な場合これをテストするためにDoctrineの機能が必要です – user1409508

+1

ユニットテストを書くためにもっと練習が必要なようです。まず第一に、単体テストの内部にコードを書くのではなく、コードを実行します。エンティティマネージャを使ってフォームを生成するコントローラをテストしようとする前に、より簡単なユニットで遊ぶことをお勧めします。あなたがテストしたいユニットと、テストダブルを使用するのか、固定データセットを持つのかなどを確認する必要があります。 – iRaS

+0

あなたは正しいかもしれません。テストを書くためにもっと練習が必要です。しかし、Doctrineに接続されたフォームとinputFiltersをどのようにテストすればよいのか説明していませんでした。 ユーザーが空のフォームを送信したとき、または入力をスキップしたときに検証メッセージを受け取るかどうかをテストします。 私がテストでコードを書いたのは、私がDoctrineで動作させようとしたことを示したかったからです – user1409508

関連する問題