首页 文章

Symfony 3.3服务模拟功能测试

提问于
浏览
9

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

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

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

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

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

1 回答

  • 1

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

    The library is very new so some feature may be missing. If you use it and miss something please provide a pull request with the desired feature.

相关问题