在Symfony 3.3之前,允许将模拟服务设置到容器上。现在使用3.3引发了弃用警告,因为该服务已经预先定义。
在容器中覆盖现有或预定义服务以为功能测试设置模拟服务的新标准方法是什么?
E.g。在我们的例子中,我们设置了一个新的实体管理器,其中一个新的模拟连接指向一个克隆的数据库进行测试。
$container->set('doctrine.orm.entity_manager', $testEm);
设置" doctrine.orm.entity_manager"自Symfony 3.3以来,不推荐使用预定义的服务,并且不再支持Symfony 4.0。
答案 0 :(得分: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']
这将覆盖原始服务中定义的服务。(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);
这样,您的测试将针对您使用setMock()
方法提供的模拟运行。
该库非常新,因此可能缺少某些功能。如果您使用它并遗漏某些内容,请提供具有所需功能的拉取请求。