这是一个基本的单元测试,几乎是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字段,但除非有必要,否则我想避免这种情况-甚至可以解决问题。