在单元测试中通过$ this引用的拦截函数调用

时间:2017-11-21 12:18:34

标签: php unit-testing decorator encapsulation

场景

我正在编写单元测试来测试目前处于开发阶段的API。我有一个模拟容器类(装饰器模式),它包含一个模拟数组,它们将被执行以代替对实际对象的调用。

这些模拟容器在测试运行期间放置在DI容器中,并且调用命中容器而不是模型/控制器。在大多数情况下,我们允许控制器功能通过,但我们偶尔会想要模拟它们。模拟容器通过__call捕获不可访问的函数调用并返回指定的模拟数据或命中内部对象来进行操作。

问题

这在以下用例中运行良好:

$this->c['Controller_Name']->functionHere()

由于c['Controller_Name']是我们的模拟容器的一个实例,但这种方法的问题来自于一个控制器在$this->functionHere()应该被模拟时通过functionHere引用自身,但调用发生在$this这是Controller的实例,而不是我们的模拟容器。

是否有合理的方法来拦截对类成员的调用,因此我可以抓住$this->functionHere()并将其正确翻译为$this->c['Controller_Name']->functionHere()

1 个答案:

答案 0 :(得分:1)

在不知道您的设置的情况下,它很难说明,但是当您使用依赖注入时,确保您将要从测试中排除的任何实现接口将意味着您可以创建模拟版本,例如使用单独的TestDIModule映射。这样你就不需要拦截任何东西。

至于捕捉对象内的函数调用 - 我建议如果你需要这样做,它可能表明你的班级正在执行多个"单位"因此,工作可以重构为单独的类并与它们接口。如上所述,将这些提取到接口将允许对它们进行独立模拟和测试。