gpt4 book ai didi

用于功能测试的 Symfony 3.3 服务模拟

转载 作者:行者123 更新时间:2023-12-02 09:20:16 25 4
gpt4 key购买 nike

在 Symfony 3.3 之前,允许在容器上设置模拟服务。现在,在 3.3 中,会抛出弃用警告,因为该服务已预先定义。

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

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

$container->set('doctrine.orm.entity_manager', $testEm);

Setting the "doctrine.orm.entity_manager" pre-defined service is deprecated since Symfony 3.3 and won't be supported anymore in Symfony 4.0.

最佳答案

几天前我也遇到了同样的问题,我写了一个库来欺骗 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() 方法提供的模拟运行。

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

关于用于功能测试的 Symfony 3.3 服务模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44323072/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com