我目前正在从事的项目包含面向对象和过程 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 操作;我认为不以某种方式 mock 他们不是一个好主意。
我该如何解决这个问题?
最佳答案
当您从命名空间调用您的函数(在全局命名空间中定义)并始终不合格地调用它们时,您可以利用 PHP's namespace fallback policy .
PHP will fall back to global functions […] if a namespaced function […] does not exist.
这允许您通过在调用者的命名空间中提供函数来创建模拟。
为了让您的生活特别轻松,我将其打包到库中 php-mock-phpunit可以与 PHPUnit 一起使用:
namespace foo;
use phpmock\phpunit\PHPMock;
class BuiltinTest extends \PHPUnit_Framework_TestCase
{
use PHPMock;
public function testTime()
{
$time = $this->getFunctionMock(__NAMESPACE__, "time");
$time->expects($this->once())->willReturn(3);
$this->assertEquals(3, time());
}
}
关于php - 在 PHPUnit 中,如何模拟不属于类的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19684428/