【问题标题】:Stub external service requests for functional tests with symfony di container使用 symfony di 容器为功能测试存根外部服务请求
【发布时间】: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...)

【问题讨论】:

    标签: php symfony phpunit


    【解决方案1】:

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

    $client = self::createClient();
    
    $serviceA = $this->getMockBuilder('ServiceA')
        ->disableOriginalConstructor()
        ->getMock();
    
    $client->getContainer()->set('my_bundle.service.a', $serviceA);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多