2017-11-11 157 views
0

问题总结与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 ...)

回答

1

根据this,应该可以在DI容器中设置模拟。

$client = self::createClient(); 

$serviceA = $this->getMockBuilder('ServiceA') 
    ->disableOriginalConstructor() 
    ->getMock(); 

$client->getContainer()->set('my_bundle.service.a', $serviceA);