【问题标题】:Symfony 5: Wire manually Controller method argumentsSymfony 5:手动连接控制器方法参数
【发布时间】:2021-07-29 11:52:46
【问题描述】:

我正在尝试模拟一项服务以测试我的控制器方法之一:

class ExampleController extends AbstractController
{
     /**
     * @Route("/example", name="app_example", methods={"POST"})
     */
     public function exampleMethod(Request $request, IService $service) {}
}

在测试环境中,我想连接一个服务的模拟,但我不知道如何手动连接控制器参数(而不是服务参数)。这是我到目前为止所做的,但它不起作用:

//services_test.yaml

  App\Controller\ExampleController:
    arguments:
      $service: '@App\Service\ServiceMock'

我收到以下错误:

Invalid service "App\Controller\ExampleController": class has no constructor.

【问题讨论】:

  • arguments 指令提供了一种通过构造函数注入依赖项的方法,所以如果你使用它,你必须像@user9245255 所说的那样添加构造函数。请您添加单元测试用例的代码。
  • 您是否正在尝试进行某种集成测试?如果是这样,那么您只需在测试环境中定义您的服务。实际上将参数注入到动作方法中的 Symfony 代码不是您可以修改的。至少不容易。

标签: symfony testing controller symfony5


【解决方案1】:

尝试在控制器中添加构造函数并将 IService 作为其参数

【讨论】:

  • 将它添加到构造函数究竟如何允许在测试环境中注入不同的实现?
【解决方案2】:

你的控制器(src/Controller/ExampleController.php):

use App\Service\IService

class ExampleController extends AbstractController
{
    /**
    * @Route("/example", name="app_example", methods={"POST"})
    */
    public function exampleMethod(Request $request, IService $service)
    {
       dd($service->testing());
    }
}

创建你的空白模拟服务(src/Service/IService.php):

namespace App\Service;

class IService
{
    public function __construct()
    {
    }
    
    public function testing(): string
    {
        return 'hello';
    }
}

Symfony 会自动注入您的服务,您不必将它放入您的 services.yaml 文件中。不过请确保在您的控制器中添加use App\Service\IService

【讨论】:

  • 嗯。问题是如何在测试环境中注入不同的 IService 实现。不是首先如何创建服务。
  • @Cerad 对不起,我误解了这个问题。这是用于单元测试吗?你会怎么做?
  • 问题本身不是很清楚,但我认为这是一个集成测试,在这种情况下,您将在 services_test.yaml 中定义 IService 的测试特定实现,它将覆盖默认实现。另一方面,该问题使用通常与单元测试相关的术语“模拟”。我想我们只需要看看原始海报是否决定回来。
  • 是的,这是一个集成测试。注入的服务依赖于外部库并连接到其他基于云的服务,这会减慢测试速度并迫使我进行非常脆弱的测试。我可能错误地使用了“mock”这个词,但本质上我想要的是:提供一个虚假的实现,以便我测试自己的逻辑,而不是这个外部服务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-20
  • 1970-01-01
  • 2017-05-25
  • 1970-01-01
  • 2016-05-01
  • 1970-01-01
相关资源
最近更新 更多