【问题标题】:PHPUnit working with Slim and PHP-DIPHPUnit 与 Slim 和 PHP-DI 一起使用
【发布时间】:2018-04-11 22:40:36
【问题描述】:

我认为我的应用程序存在设计缺陷。我会解释原因。

我有一个围绕 httpclient 的包装器,它被注入(通过 php-di)到各种其他类中。

我使用 Slim 创建一个 api。当调用进入我的应用程序时,Slim 会将其引导到正确的控制器,该控制器注入了一个 httpclient。 (实际上,注入 httpclient 的不是控制器,但我试图在示例中保持简单)

现在到单元测试(集成测试)部分。 我使用引导文件来初始化 slim(使用 php-di 桥接器)。我对每个环境都有不同的文件。所以另一个类(存根,如果你喜欢的话),作为 httpclient 注入到控制器中。

到目前为止一切顺利。 现在我想根据我的意愿改变这个 httpclient-stub 的结果。像这样:

// Arrange
$request = ..;
$response = ..;
$httpclientStub->setResponseMessage($response);

//Act
$response = $app->process($request, new Response());

//Assert
..

不幸的是,我无法从测试函数中访问 $httpclientStub。我现在使用单例类将变量从测试传递到存根。这是相当丑陋的。

对更好的“存根”解决方案有什么建议吗?

【问题讨论】:

  • 默认情况下,容器条目是“冻结的”。我使用反射将模拟“注入”到容器中(仅用于集成测试)。 Example with Pimple
  • 看起来它毕竟没有被冻结。我在 $app 上使用了 getContainer(),并且可以在其中设置类。

标签: php phpunit slim php-di


【解决方案1】:

我使用了以下方法,根本不需要使用单例。我们在测试运行时更改容器。感觉不那么老套了。

public function setResponseMessage(HttpMessage $response)
    {
      $httpClient = new \Stub\HttpClientStub();
      $httpClient->setResponseMessage($response);

      $container = $this->app->getContainer();
      $container->set(\Helper\IHttpClient::class, $httpClient);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 2021-01-09
    • 2016-01-07
    • 2017-06-12
    • 2017-09-16
    • 1970-01-01
    相关资源
    最近更新 更多