在单元测试中拦截通过 $this 引用的函数调用
Intercepting function calls referenced via $this in unit tests
场景
我正在编写单元测试来测试目前处于开发阶段的 API。我有一个模拟容器 class(装饰器模式),其中包含一组模拟,这些模拟将在调用实际对象时执行。
这些模拟容器在测试期间被放置在 DI 容器中 运行 并且调用命中容器而不是 model/controllers。在大多数情况下,我们允许控制器函数通过,但有时我们想模拟它们。模拟容器通过 __call
捕获不可访问的函数调用并返回分配的模拟数据或命中内部对象来运行。
问题
这适用于以下使用情况:
$this->c['Controller_Name']->functionHere()
因为 c['Controller_Name']
是我们的模拟容器的一个实例,但是这种方法的问题来自控制器通过 $this->functionHere()
引用自身,当 functionHere
应该被模拟时,但是调用发生在 $this
上,它是 Controller 的实例而不是我们的 Mock Container。
是否有一种合理的方法来拦截对 classes 自己成员的调用,这样我就可以捕获 $this->functionHere()
并将其适当地转换为 $this->c['Controller_Name']->functionHere()
在不知道您的设置的情况下很难谈论具体细节,但是当您使用依赖注入时,确保您连接任何您希望从测试中排除的实现将意味着您可以创建模拟版本,例如使用单独的 TestDIModule 进行映射.这样你就不需要拦截任何东西了。
至于在对象中捕获函数调用 - 我建议如果您需要这样做,这可能表明您的 class 正在执行多个 "units" 工作,因此可以重构为分离 classes 并将它们连接起来。如上所述,将它们提取到接口将允许它们被独立地模拟和测试。
场景
我正在编写单元测试来测试目前处于开发阶段的 API。我有一个模拟容器 class(装饰器模式),其中包含一组模拟,这些模拟将在调用实际对象时执行。
这些模拟容器在测试期间被放置在 DI 容器中 运行 并且调用命中容器而不是 model/controllers。在大多数情况下,我们允许控制器函数通过,但有时我们想模拟它们。模拟容器通过 __call
捕获不可访问的函数调用并返回分配的模拟数据或命中内部对象来运行。
问题
这适用于以下使用情况:
$this->c['Controller_Name']->functionHere()
因为 c['Controller_Name']
是我们的模拟容器的一个实例,但是这种方法的问题来自控制器通过 $this->functionHere()
引用自身,当 functionHere
应该被模拟时,但是调用发生在 $this
上,它是 Controller 的实例而不是我们的 Mock Container。
是否有一种合理的方法来拦截对 classes 自己成员的调用,这样我就可以捕获 $this->functionHere()
并将其适当地转换为 $this->c['Controller_Name']->functionHere()
在不知道您的设置的情况下很难谈论具体细节,但是当您使用依赖注入时,确保您连接任何您希望从测试中排除的实现将意味着您可以创建模拟版本,例如使用单独的 TestDIModule 进行映射.这样你就不需要拦截任何东西了。
至于在对象中捕获函数调用 - 我建议如果您需要这样做,这可能表明您的 class 正在执行多个 "units" 工作,因此可以重构为分离 classes 并将它们连接起来。如上所述,将它们提取到接口将允许它们被独立地模拟和测试。