Symfony 4: Написание модульных тестов для класса Form, использующего поля EntityType - PullRequest
0 голосов
/ 11 октября 2018

Вот базовый модульный тест, который в значительной степени пример, приведенный в документации Symfony :

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 (), 0 переданов {path} \ vendor \ symfony \ form \ FormRegistry.php в строке 92 и ожидается ровно 1

Trace:

{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, если я чего-то не понял.Autowiring установлен как true в services.yaml, а ManagerRegistry является автоматически желательным (я проверил, используя консоль с опцией debug: autowiring).

Мой класс DemandeInfosType использует поля EntityType:

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

MyПредполагается, что это поле заставляет форму требовать Doctrine, поскольку ему, очевидно, необходим доступ к ней для извлечения сущностей из моей базы данных.

Итак, мой вопрос: это нормально?Это известное ограничение каркаса?Это вопрос изменения некоторых значений в конфигурационных файлах?

Обходной путь, о котором я думаю, - это вместо этого использовать поле ChoiceType, но я бы хотел этого избежать, если в этом нет необходимости - если оно дажеможет решить проблему.

...