php Symfony测试如何通过容器将依赖项传递给服务

4xrmg8kj  于 2023-06-21  发布在  PHP
关注(0)|答案(1)|浏览(83)

我正在为Symfony 4.4应用程序编写测试,我需要模拟一个名为TokenService的服务,这是我需要测试的一些类(存储库,服务)的依赖项,但我不确定如何通过DI传递一些依赖项:

self::$container->get('App\Services\classToTest') // Not able to pass dependencies ?

我是否被迫示例化类并做类似这样的事情:

$classToTest = new \App\Services\classToTest($depencencyOne,$tokenMock,...)

另外,我只需要模拟其中一个依赖项,那么我是否必须传递所有其他依赖项?

6bc51xsx

6bc51xsx1#

您可以从测试服务容器中get(),但也可以set()
我可以给予一个真实的例子,我最近在一些测试中需要用它的模拟实现替换HttpClient

// Here I replace the service with a mock implementation (a PHPUnit mock can work too)
self::getContainer()->set(HttpClientInterface::class, new MockHttpClient([
    new MockResponse('{"some":"JSON"}'),
    new MockResponse('{"other":"JSON"}'),
]));

// Here $myService will get the mock injected instead of the original HTTP Client
$myService = self::getContainer()->get(MyService::class);

但应该注意的是,我必须将服务公开才能覆盖它:

# services.yaml
when@test:
    services:
        Symfony\Contracts\HttpClient\HttpClientInterface:
            alias: '.debug.http_client'
            public: true

如果你没有(或者不能)替换服务容器中的依赖项,那么你需要自己示例化测试过的服务并获取每个依赖项:

$myService = new MyService(
     self::getContainer()->get(RealService::class),
     $someMockDependency
);

如果问题来自您自己的代码,请确保遵循良好的实践,使您的代码更容易测试(主要是依赖注入依赖反转原则)。

相关问题