問題總結與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 ...)