Symfony 4:为使用EntityType字段的Form类编写单元测试

时间:2018-10-11 16:22:58

标签: php unit-testing symfony doctrine-orm symfony4

这是一个基本的单元测试,几乎是the example given in the Symfony docs

namespace App\Tests\Form\Type;


use App\Entity\DemandeInfos;
use App\Form\DemandeInfosType;
use Symfony\Component\Form\Test\TypeTestCase;

class DemandeInfosTypeTest extends TypeTestCase
{

    public function testSubmit()
    {
        $formData = array(); // Should have info to fill the form with

        $objForm = new DemandeInfos();

        $form = $this->factory->create(DemandeInfosType::class, $objForm);

        $obj = new DemandeInfos();
        //...populating object...

        $form->submit($formData);

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

        $this->assertEquals($obj, $objForm);

        // Check FormView
        $view = $form->createView();
        $children = $view->children;

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

由于$ formData和$ obj为空,现在它不能按原样工作,但是这里的错误不是由我的函数不完整引起的。 如果我们尝试执行此测试,则最终会收到以下错误消息:

  

ArgumentCountError:函数Symfony \ Bridge \ Doctrine \ Form \ Type \ DoctrineType :: __ construct()的参数太少,在第92行的{path} \ vendor \ symfony \ form \ FormRegistry.php中传递了0,并且恰好期望1

踪迹:

{path}\vendor\symfony\doctrine-bridge\Form\Type\DoctrineType.php:102
{path}\vendor\symfony\form\FormRegistry.php:92
{path}\vendor\symfony\form\FormFactory.php:74
{path}\vendor\symfony\form\FormBuilder.php:97
{path}\vendor\symfony\form\FormBuilder.php:256
{path}\vendor\symfony\form\FormBuilder.php:206
{path}\vendor\symfony\form\FormFactory.php:30
{path}\tests\Form\Type\DemandeInfosTypeTest.php:26 //$form = $this->factory->create(DemandeInfosType::class, $objForm);

该错误在DoctrineType构造中:

 public function __construct(ManagerRegistry $registry)
 {
        $this->registry = $registry;
 }

因此,似乎服务自动装配不起作用,Symfony也不向其提供ManagerRegistry服务,除非我误会了一些东西。在services.yaml中将自动装配设置为true,并且可以自动装配ManagerRegistry(我使用带有debug:autowiring选项的控制台进行了检查。)

我的DemandeInfosType类使用EntityType字段:

->add('car', EntityType::class, array(
                'class' => Car::class,
                'choice_label' => 'nom',
))

我的假设是此字段使表单需要使用Doctrine,因为显然需要访问它才能获取我数据库中的实体。

所以我的问题是:这正常吗?这是框架的已知限制吗?更改配置文件中的某些值是否有问题?

我正在考虑的解决方法是改用ChoiceType字段,但除非有必要,否则我想避免这种情况-甚至可以解决问题。

0 个答案:

没有答案