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

问题描述 投票:0回答:1

我想用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次失败:

声明false为真的失败。

这发生在$ 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,我必须传入一个数组。该数组将转换为我的数据对象。

php forms symfony unit-testing
1个回答
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不同。

© www.soinside.com 2019 - 2024. All rights reserved.