如何以 Symfony 形式对实体断言进行单元测试?

How to unit test entity assert in Symfony form?

使用 Symfony 4.2,我有带有断言的实体:

...
/**
 * @var string
 *
 * @Assert\NotBlank()
 * @Assert\Email()
 */
private $email;
...

我有这个实体的表格:

$builder
    ...
    ->add('email', null, [
        'label' => 'label.email',
        'help' => 'email.help_privacy',
    ])
    ...

我想测试这个表格。我阅读了文档:How to Unit Test your Forms

但是当我想测试这种形式时,但是我不知道如何测试断言。这里的电子邮件未完成 而我有一个 Notblank() assert.

public function testSubmitValidData(): void
{
    $formData = [
        'name' => 'Sheriff Woody',
        'message' => 'Hello Sheriff Woody',
    ];

    $objectToCompare = new Contact();

    $form = $this->factory->create(ContactType::class, $objectToCompare);

    $object = new Contact();
    $object->setName('Sheriff Woody');
    $object->setMessage('Hello Sheriff Woody');

    $form->submit($formData);

    $this->assertTrue($form->isSynchronized());

    $this->assertEquals(
        $object,
        $objectToCompare
    );

    $view = $form->createView();
    $children = $view->children;

    foreach (array_keys($formData) as $key) {
        $this->assertArrayHasKey(
            $key,
            $children
        );
    }
}

但我不知道如何测试我的实体的断言。你能帮帮我吗?

免责声明:我通常使用功能测试而不是单元测试来测试我的表单。

断言部分不是真正的形式,它是验证。您可以单独测试它(因为您选择 TU 而不是 TF)。

您的问题已记录在 documentation:

NOTE Don't test the validation: it is applied by a listener that is not active in the test case and it relies on validation configuration. Instead, unit test your custom constraints directly.

就我个人而言,我真的不明白对 small/medium 项目的表单进行单元测试的意义,因为我们可以放心地假设 Symfony 的表单工厂运行良好。