【问题标题】:Intercepting function calls referenced via $this in unit tests在单元测试中拦截通过 $this 引用的函数调用
【发布时间】:2018-05-04 21:49:40
【问题描述】:

情景

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

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

问题

这在以下用例中效果很好:

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

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

是否有一种可行的方法来拦截对类自己成员的调用,所以我可以捕获$this->functionHere() 并将其适当地转换为$this->c['Controller_Name']->functionHere()

【问题讨论】:

    标签: php unit-testing decorator encapsulation


    【解决方案1】:

    在不了解您的设置的情况下很难谈论具体细节,但是当您使用依赖注入时,确保您连接您希望从测试中排除的任何实现将意味着您可以创建模拟版本,例如使用单独的 TestDIModule 进行映射。这样你就不需要拦截任何东西了。

    至于在对象中捕获函数调用 - 我建议如果您需要这样做,这可能表明您的类正在执行多个“单元”工作,因此可以重构为单独的类并接口它们。如上所述,将它们提取到接口中,可以独立地模拟和测试它们。

    【讨论】:

    • 接受这个作为答案,虽然这不是我最终得到的解决方案,但它肯定会把我带到那里。抱歉回复晚了。
    猜你喜欢
    • 2015-04-16
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 2019-05-30
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    相关资源
    最近更新 更多