2017-11-11 155 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);