在控制器测试中覆盖Symfony 3.3容器服务

Tom*_*itt 7 php phpunit dependency-injection symfony symfony-3.3

我对依赖于需要在测试环境中模拟的第三方API的控制器进行了一系列测试.我们覆盖功能测试客户端爬虫并模拟我们需要测试的依赖项.这里的关键是每次测试都会改变模拟.

在Symfony 3.2中,这个工作正常,但在Symfony 3.3中,由于现在注入服务的方式,我有一些弃用警告:

示例控制器测试用例:

class MyControllerTest extends WebTestCase
{
    private static $kernelModifier = null;

    public function setKernelModifier(\Closure $kernelModifier)
    {
        self::$kernelModifier = $kernelModifier;
        $this->ensureKernelShutdown();
    }

    protected static function createClient(array $options = [], array $server = [])
    {
        static::bootKernel($options);

        if ($kernelModifier = self::$kernelModifier) {
            $kernelModifier->__invoke();
            self::$kernelModifier = null;
        };

        $client = static::$kernel->getContainer()->get('test.client');
        $client->setServerParameters($server);

        return $client;
    }

    protected function getPropertyClient()
    {
        $mockService = (new PropertyMock())->getPropertyMock();
        $this->setKernelModifier(function () use ($mockService) {
            static::$kernel->getContainer()->set('app.property_service', $mockService);
        });
        return static::createClient();
    }

    protected function getPropertyFailureClient()
    {
        $mockService = (new PropertyMock())->getPropertyFailureMock();
        $this->setKernelModifier(function () use ($mockService) {
            static::$kernel->getContainer()->set('app.property_service', $mockService);
        });
        return static::createClient();
    }
}
Run Code Online (Sandbox Code Playgroud)

实际测试:

public function testInvalidPropertyRequest()
{
    $client = $this->getPropertyClient();
    $client->request(
        'POST',
        '/webhook/property',
        [],
        [],
        [],
        ''
    );
    $this->assertEquals(400, $client->getResponse()->getStatusCode());
}
Run Code Online (Sandbox Code Playgroud)

弃用错误:

从Symfony 3.3开始,不再支持设置"app.property_service"预定义服务,并且Symfony 4.0中不再支持它:3x

我已经阅读了3.3发布文档,BC中断和弃用,并且无法弄清楚如何在配置后用模拟替换容器服务.

任何帮助表示赞赏.

mas*_*ann 2

我也面临这个问题,并且 Container 类中没有关于如何处理此弃用的提示。

// 对于所有感兴趣的人,github 上有一个当前的问题- 但除了为单元测试提供更多引导代码或单独测试控制器之外,没有真正的解决方案。我建议将所有控制器定义为具有固定/定义依赖性的服务,并且不直接使用 DIC。