Symfony 3.3服务模拟功能测试

Unc*_*ion 9 functional-testing symfony

在Symfony 3.3之前,允许将模拟服务设置到容器上.现在使用3.3引发了弃用警告,因为该服务已经预先定义.

覆盖容器中现有或预定义服务以为功能测试设置模拟服务的新标准方法是什么?

例如,在我们的例子中,我们设置了一个新的实体管理器,其中一个新的模拟连接指向一个克隆的数据库进行测试

$container->set('doctrine.orm.entity_manager', $testEm);
Run Code Online (Sandbox Code Playgroud)

自Symfony 3.3起,不再支持设置"doctrine.orm.entity_manager"预定义服务,Symfony 4.0中将不再支持该服务.

TiM*_*TER 2

几天前我也遇到了同样的问题,我写了一个库来欺骗 Symfony 的 DIC: https: //github.com/TiMESPLiNTER/proxy-mock

这个想法是用原始服务类中的“代理”覆盖 config_test.yml 中的服务,该代理将所有调用重定向到模拟,然后可以在测试用例中动态设置模拟。

# config_test.yml
services:
    timesplinter.proxy_mock.factory:
        class: timesplinter\ProxyMock\ProxyMockFactory

    acme.api.client:
        factory: 'timesplinter.proxy_mock.factory:create'
        arguments: ['Acme\AppBunde\Services\ApiClient']
Run Code Online (Sandbox Code Playgroud)

这将使用其代理覆盖原始服务中定义的服务。(xml|yml)。

在测试用例中,您可以执行以下操作:

// Your container aware test case (this exmaple is for PHPUnit)
$mock = $this->getMockBuilder(ApiClient::class)->disableOriginalConstructor()->getMock();

$container->set('acme.api.client')->setMock($mock);
Run Code Online (Sandbox Code Playgroud)

这样,您的测试将针对您使用该setMock()方法提供的模拟运行。

该库非常新,因此可能缺少某些功能。如果您在使用它时错过了某些内容,请提供包含所需功能的拉取请求。