Symfony 5.4单元测试调用表单构建器触发ArgumentCountError
问题解决:Symfony表单单元测试构造函数参数不足错误
错误原因
生产/开发环境中Symfony依赖注入容器会自动为EventType注入LegalServiceRepository,但单元测试使用TypeTestCase时,其提供的表单工厂是简化实现,不会自动处理表单类型的依赖注入。当EventFormBuilder调用formFactory->create(EventType::class, $event)时,系统会尝试无参实例化EventType,但它的构造函数要求传入1个参数,因此触发ArgumentCountError。
解决方案
方案1:手动模拟依赖并注册表单类型(轻量,适合单元测试)
在测试类中创建LegalServiceRepository的模拟对象,手动注册到表单工厂中:
class EventFormBuilderTest extends TypeTestCase { private LegalServiceRepository $legalServiceRepoMock; protected function setUp(): void { parent::setUp(); // 创建模拟仓库,定义方法返回值 $this->legalServiceRepoMock = $this->createMock(LegalServiceRepository::class); $this->legalServiceRepoMock->method('findAllOfTypeEvent')->willReturn([]); } public function testSuccessfullyCreatesForm(): void { // 手动注册EventType及子类,传入模拟依赖 $typeRegistry = $this->factory->createBuilder()->getTypeExtensions(); $typeRegistry->addType(new EventType($this->legalServiceRepoMock)); $typeRegistry->addType(new GlobalAdminEventType($this->legalServiceRepoMock)); $formBuilder = new EventFormBuilder($this->factory); $user = new User(); $actualEvent = new Event(); $form = $formBuilder->buildFormBasedOnUserRole($user, $actualEvent); // 示例断言:验证表单实例 $this->assertInstanceOf(FormInterface::class, $form); } }
方案2:使用KernelTestCase获取容器(贴近实际环境,测试稍重)
改用KernelTestCase启动Symfony内核,直接从容器中获取已配置好依赖的表单工厂:
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; use Symfony\Component\Form\FormFactoryInterface; class EventFormBuilderTest extends KernelTestCase { public function testSuccessfullyCreatesForm(): void { self::bootKernel(); // 从容器中获取已注入依赖的表单工厂 $formFactory = self::getContainer()->get(FormFactoryInterface::class); $formBuilder = new EventFormBuilder($formFactory); $user = new User(); $actualEvent = new Event(); $form = $formBuilder->buildFormBasedOnUserRole($user, $actualEvent); $this->assertInstanceOf(FormInterface::class, $form); } }
内容的提问来源于stack exchange,提问作者döner666
相关产品推荐
相关产品推荐

