单元测试具有自定义data_class的Symfony FormType失败

时间:2017-12-22 01:27:58

标签: php forms symfony unit-testing

我想用PHPUnit开始测试我的表单。 首先,我创建了一个简单的表单。

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个公共财产。 “用户名”和“密码”。

之后我跟着文档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());

如果我调整表单以使用数组并在测试中传入一个数组,它可以正常工作。 我做错了什么?

---编辑1

在Lugi Hauges回答之后我发现它在某处抛出了TransformationException。 (我没有看到它,因为它被抓住了)

因为我的表格是一种好的形式

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

我没有传递数组。所以我现在知道它在哪里抛出。 但不是为什么。我以为我可以使用数据对象来实现自定义数据映射器吗? 我认为这不应该是必要的,因为我的财产是公开的。

---编辑2

Aaaah,我必须传入一个阵列。该数组将转换为我的数据对象。

1 个答案:

答案 0 :(得分:0)

提交方法中有一个if条件:

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

它会抛出TransformationFailedException。在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;
            }
        }

如您所见,$e分配给$this->transformationFailure

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

当您调用isSynchronized方法时,它会返回false,因为transformationFailure的值与null不同。