【发布时间】:2017-11-15 03:05:04
【问题描述】:
问题摘要
是否可以在我的测试用例中将存根/模拟注入到 symfony di 容器中以模拟不同的外部 api 响应?
- 测试我的应用程序是否在 api 返回错误时发送电子邮件(我想为我的 http 客户端类注入一个返回 HTTP 500 的存根)
- 测试我的应用程序使用 2 个不同的 API 作为源返回正确的结果(我想将两个 HTTP 客户端作为具有特定结果主体的存根注入)
详情
我想为使用 symfony di 容器的 silex 应用程序编写功能测试。该应用程序使用多个 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);
每次我调用 get 方法时,DiContainer 都会返回一个新实例。这绝对是有道理的。所以这行不通。
在 di 容器中覆盖 http 客户端
$this->getDiContainer->set('MyHttpClient', $myHttpClientStub);
不起作用,因为 symfony 不允许在运行时更改定义。而且它似乎需要一个定义,而不是一个实例。
PHP-VCR
在我的生产代码中进行一些更改,因为它在我的 curl 标头回调中弄乱了 HTTP 标头。不适用于其他服务(rabbitmq...)
【问题讨论】: