0

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

我有一个围绕 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。我现在使用单例类将变量从测试传递到存根。这是相当丑陋的。

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

4

1 回答 1

0

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

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

      $container = $this->app->getContainer();
      $container->set(\Helper\IHttpClient::class, $httpClient);
    }
于 2018-04-11T14:40:36.030 回答