我目前正在从事的项目包含面向对象和过程化 PHP 代码的混合体。所以我有这样的东西:
function doStuff($value) { $x = $value + 1; return $x; } class MyClass { private $field; public function setMyValue($amount) { $this->field = doStuff($amount) + doStuff(2 * $amount); } }
这些依赖项有几个,但是很少(一只手就能数出来)。但是,我需要为类编写单元测试(使用 PHPUnit),并且我不知道如何模拟来自程序端的函数(在本例中为 doStuff
)。据我所知,PHPUnit 中的模拟功能仅适用于类。
我会在没有任何模拟的情况下完成它,但问题是其中一些函数执行一些 IO 操作;我认为不以某种方式嘲笑他们并不是一个好主意。
我该如何解决这个问题?
我看到的唯一选项是依赖注入,因为您的类想要使用类外部的资源。因此,这打破了一些封装规则。
我过去是如何做到这一点的,是将这些函数放在自己的类中并要求/包含它们,并且当设置测试变量时,包含一个具有相同的半“模拟”函数的基本文件,该文件返回已知状态。
我的另一种方法是创建一个简单的 UTILITY 类,其中包含所有这些数据函数,然后使用依赖项注入和模拟来进行测试。
测试:
当您从名称空间调用函数(在全局名称空间中定义)并始终将它们称为不合格的函数时,您可以利用 PHP 的命名空间回退策略。
这允许您通过在调用者的命名空间内提供函数来创建模拟。
为了让您的生活变得特别轻松,我将其打包到库中 php-mock- phpunit 可以与 PHPUnit 一起使用: