Symfony 控制器作为测试速度的服务问题

Symfony Controller as a service issue with test speed

当我使用以下配置(一些信息已编辑)时,运行 我们在 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 上进行了长时间的讨论后,我遇到了 ,其中提到自动装配通常会调用设置容器方法(就像我的代码示例的最后一行)。这允许控制器使用那些特定的 Symfony 方法,因为它可以访问容器的精简版本。

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

我也试过以下方法:

  App\Bundle\Controller\Controller:
    autowire: true

因为我们确实启用了自动装配,但仅限于一个目录。在执行上述操作时,代码都可以正常运行,但是测试仍然花费了同样长的时间

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

TIA

正如其他地方提到的几个帖子,发生的错误是由于 jms/di-extra-bundle。当我们删除它时,测试速度大大提高