单元测试复杂的Symfony 2表单

时间:2014-01-03 16:58:42

标签: forms unit-testing symfony phpunit

有没有人找到一种方法来单元测试依赖于实体字段类型的Symfony表单?

我尝试过本教程:

http://symfony.com/doc/current/cookbook/form/unit_testing.html

包括关于添加表单类型的此部分取决于:

http://symfony.com/doc/current/cookbook/form/unit_testing.html#adding-a-type-your-form-depends-on

但是,似乎实体字段类型依赖于注册表参数,所以我尝试模拟实体字段类型,但现在phpunit报告了其他错误。

由于单元测试表格看起来非常重要,似乎有人必须找到一种方法来完成这项工作。但是,尽管我进行了广泛的搜索,但我还没有找到解决方案。

1 个答案:

答案 0 :(得分:0)

您可以完成错误并进行测试,是的。

您最终会收敛的设置将如下所示:

// this is the method to register additional form types as 
// in the article http://symfony.com/doc/current/cookbook/form/unit_testing.html#adding-a-type-your-form-depends-on
protected function getExtensions()
{
    $entity = $this->mockEntityType();

    return [
        new PreloadedExtension(
            [
                $entity->getName()  => $entity
            ],
            []
        )
     ];
 }

让这种类型没有爆炸的实际工作:

// extracted out double setup for clarity
private function mockEntityType()
{
    $manager = $this->prophesize('Doctrine\Common\Persistence\ObjectManager');
    $registry = $this->prophesize('Doctrine\Common\Persistence\ManagerRegistry');
    $metadata = $this->prophesize('Doctrine\Common\Persistence\Mapping\ClassMetadata');
    $repository = $this->prophesize('Doctrine\Common\Persistence\ObjectRepository');

    $repository->findAll()->willReturn([]);
    $manager->getClassMetadata(Argument::cetera())->willReturn($metadata->reveal());
    $manager->getRepository(Argument::cetera())->willReturn($repository->reveal());
    $registry->getManagerForClass(Argument::cetera())->willReturn($manager->reveal());

    return new EntityType($registry->reveal());
}

请注意,这是使用自the prohpecy mocking framework

以来随phpunit一起提供的version 4.5.0

显示的代码只是设置所有内容以返回任何实体存储库的空数组。根据您的需要进行更改。