Вот базовый модульный тест, который в значительной степени пример, приведенный в документации 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, но я бы хотел этого избежать, если в этом нет необходимости - если оно дажеможет решить проблему.