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、私は配列を渡す必要があります。この配列は私のデータオブジェクトに変換されます。
お世話になりました。 例外がキャッチされているので、私はそれを全く見ませんでした。 – psren