与symfony的DI容器
问题描述:
问题总结与symfony的DI容器
功能测试存根外部服务请求是否有可能注入在我的测试情况下,存根/嘲笑symfony的DI容器来模拟不同的外部API响应?
- 测试,如果API返回一个错误(我想注入一个存根返回一个HTTP 500我的HTTP客户端类)
- 测试我的应用程序返回使用2个正确的结果我的应用程序发送电子邮件不同的API作为源(ⅰ要注入两个HTTP客户端作为存根与特定结果体)
细节
我想要写的硅石应用功能测试,美是symfony di容器。该应用程序使用多个API作为后端来满足客户端请求。
该代码注入一个抽象的http客户端到api客户端,我可以注入一个http api客户端存根。
class AwesomeApiClient
__construct(MyHttpClient $httpClient);
class MyApiHttpClient
这对单元测试非常有用。
现在我想写功能测试。 我扩展了silex WebTestCase
并实现了应用程序初始化。 MyApiHttpClient注入symfony di容器。
现在我想做的事情是这样的:
# symfony di container does not allow this
$this->getDiContainer()->set('my_http_client', $myHttpClientStubInstance);
我想我的配置在每个测试存根,以便我能够在同一个请求测试不同(例如错误,成功)响应。
事情我已经尝试:
使用setter注入在运行时
$his->getDiContainer()->get('MyApiClient')->setHttpClient($myMock);
的DiContainer返回每次一个新实例我调用get方法。这确实有意义。所以这是行不通的。
重写HTTP客户端在DI容器
$this->getDiContainer->set('MyHttpClient', $myHttpClientStub);
不起作用,因为symfony中不允许在运行时更改的定义。此外,它似乎需要一个定义,而不是一个实例。
PHP-VCR
是否与我的生产代码的一些变化工作,因为它在我的卷曲头回调搅乱HTTP标头。不适用于其他服务(rabbitmq ...)
答
根据this,应该可以在DI容器中设置模拟。
$client = self::createClient();
$serviceA = $this->getMockBuilder('ServiceA')
->disableOriginalConstructor()
->getMock();
$client->getContainer()->set('my_bundle.service.a', $serviceA);