Symfony Controller即服务的测试速度问题

问题描述

使用以下配置时,在Symfony应用程序上运行功能测试套件时遇到问题(已删除一些信息):

  App\Bundle\Controller\Controller:
    arguments:
      - '@datatable'
      - '@filtermanager'
      - '@App\Bundle\Service\FilterService'
      - '@translator'
    tags: ['container.service_subscriber']
    calls: [['setContainer',['@Psr\Container\ContainerInterface']]]

我们当前正在运行Symfony 3.4,但是很快将其升级到4.4,因此尝试编写兼容的代码,因此将控制器声明为服务,并将DI用于服务而不是从容器中获取。这样做时,我们注意到我们无法访问某些Symfony方法,例如render()createForm()getDoctrine()等,因为这些方法需要容器。

在Google进行了长时间的讨论之后,我遇到了this article,其中提到自动装配通常会调用set容器方法(就像我的代码示例的最后一行一样)。然后,这允许控制器使用那些特定的Symfony方法,因为它可以访问容器的精简版本。

无论如何,通过上述操作,它使我们的功能测试套件从耗时12分钟缩短到1-3小时之间的任何时间。到目前为止,还没有针对控制器或与此代码相关的功能测试。在手动测试行为时,我也没有发现性能上的障碍。

我也尝试了以下方法

  App\Bundle\Controller\Controller:
    autowire: true

因为我们确实启用了自动装配,但仅适用于一个目录。通过上述操作,代码都可以正常工作,但是测试仍然花费了相当长的时间

我希望有人对为什么发生这种情况有一个解释,或者可能对如何解决它有一个答案。我想尝试避免手动注入FormFactoryEntityManager之类的东西,因为当这些辅助方法可用时,这似乎毫无意义。

TIA

解决方法

正如其他地方提到的几篇文章所述,发生的错误是由于jms / di-extra-bundle引起的。删除后,测试速度急剧提高