【发布时间】: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(),并且可以在其中设置类。