我想我的应用程序有一个设计缺陷。我会解释为什么。
我有一个关于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。我现在使用单例类将测试中的变量传递给存根。这是相当丑陋的。
关于更好的"存根"解决方案的任何建议?
我使用了以下方法,它根本不需要使用单例。我们在测试运行时更改容器。感觉不那么笨拙了。
public function setResponseMessage(HttpMessage $response)
{
$httpClient = new StubHttpClientStub();
$httpClient->setResponseMessage($response);
$container = $this->app->getContainer();
$container->set(HelperIHttpClient::class, $httpClient);
}