gpt4 book ai didi

php - 在 PHPUnit 中,如何模拟不属于类的函数?

转载 作者:搜寻专家 更新时间:2023-10-31 21:10:52 25 4
gpt4 key购买 nike

我目前正在从事的项目包含面向对象和过程 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com