我想用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,我必须传入一个阵列。该数组将转换为我的数据对象。
答案 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
不同。