PHPUnit使用Slim和PHP-DI

时间:2018-04-11 13:20:49

标签: php phpunit slim php-di

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

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

我使用Slim创建一个api。当呼叫进入我的应用程序时,Slim会将其引导到右侧控制器,该控制器已注入httpclient。 (实际上,不是他注入了httpclient的控制器,但是我试图让这个例子保持简单)

现在进行单元测试(integrationtesting)部分。 我使用bootstrap文件来初始化slim(使用php-di桥)。我为每个环境都有不同的文件。因此,另一个类(存根,如果您愿意)将被注入控制器中的httpclient。

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

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

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

//Assert
..

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

对更好的'存根的任何建议?溶液

1 个答案:

答案 0 :(得分:0)

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

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

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