2017-12-22 18 views
0

PHPUnitでフォームのテストを開始したいと考えています。 まず、簡単なフォームを作成しました。Unit-Test a Symfonyカスタムのdata_classでFormTypeが失敗する

final class LoginFormType extends AbstractType 
{ 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('username', TextType::class); 
     $builder->add('password', PasswordType::class); 
     $builder->add('submit', SubmitType::class); 
    } 


    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => LoginFormData::class 
     )); 
    } 

} 

私はdata_classを定義しました。このクラスは後でバリデーションなどを行います。しかし、今のところこれはうまくいくはずです。私はブラウザでフォームをテストし、うまくいきました。 現時点では2つの公共財産のみです。 "username"と "password"。その後

は、私は、このテストケースで終わったドキュメントhttps://symfony.com/doc/3.3/form/unit_testing.html

を追いました。

function it_submits_valid_data() 
    { 
     $data = new LoginFormData(); 
     $data->username = 'John'; 
     $data->password = 'yoloyolooooo'; 

     $form = $this->factory->create(LoginFormType::class); 

     $form->submit($data); 

     $this->assertTrue($form->isSynchronized()); 
     $this->assertEquals($data, $form->getData()); 
     $this->assertTrue($form->isValid()); 

     $view = $form->createView(); 
     $children = $view->children; 
     foreach (array_keys($data) as $key) { 
      $this->assertArrayHasKey($key, $children); 
     } 
    } 

しかし、動作しません。私は次のエラー

を取得しています 1つの失敗がありました:

偽が真であること をアサートに失敗しました。

これは$ this-> assertTrue($ form-> isSynchronized());この行で発生します。

私は配列を使用するようにフォームを調整し、テストで配列を渡すと正常に動作します。 どうしたのですか? Lugi Hauges後

---編集1

は、私はそれがどこかTransformationExceptionをスローすることを考え出した答え。 (それはcatchedますので、私はそれを見ていない)

私のフォームはcoumpoundフォーム

if (!is_array($submittedData)) { 
    throw new TransformationFailedException('Compound forms expect an array or NULL on submission.'); 
} 

ですので、私は配列を渡していませんでした。だから私は今どこにそれがスローされるか知っています。 しかし、なぜそうではありません。私はData-Objectsを使用できると思ったのですが、カスタムdatamapperを実装する必要がありますか? 私のプロパティは公開されているので、これは必要ではないはずだと思いました。

---編集2

Aaaah、私は配列を渡す必要があります。この配列は私のデータオブジェクトに変換されます。

答えて

0

はそのような条件がで提出する場合の方法があります:

 if (!is_array($submittedData)) { 
      throw new TransformationFailedException('Compound forms expect an array or NULL on submission.'); 
     } 

、それだがTransformationFailedExceptionをスローします。 nullと同一ではないtransformationFailureの値ので、catchブロック、

... 
... 
... 
     } catch (TransformationFailedException $e) { 
      $this->transformationFailure = $e; 

      // If $viewData was not yet set, set it to $submittedData so that 
      // the erroneous data is accessible on the form. 
      // Forms that inherit data never set any data, because the getters 
      // forward to the parent form's getters anyway. 
      if (null === $viewData && !$this->config->getInheritData()) { 
       $viewData = $submittedData; 
      } 
     } 

でご覧のように、あなたがisSynchronizedメソッドを呼び出すとき$e$this->transformationFailure

public function isSynchronized() 
{ 
    return null === $this->transformationFailure; 
} 

に割り当て、それはfalseを返します。

+0

お世話になりました。 例外がキャッチされているので、私はそれを全く見ませんでした。 – psren

関連する問題