【问题标题】:Unit-Test a Symfony FormType with custom data_class fails使用自定义 data_class 对 Symfony FormType 进行单元测试失败
【发布时间】:2017-12-22 01:27:57
【问题描述】:

我想开始使用 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.');
}

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

--- 编辑 2

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

【问题讨论】:

    标签: php forms symfony unit-testing


    【解决方案1】:

    submit 方法中有一个 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 不同。

    【讨论】:

    • 非常感谢您帮了我很多忙。由于异常被捕获,我根本没有看到它。
    猜你喜欢
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    相关资源
    最近更新 更多