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

标签 php mocking phpunit

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

相关文章:

windows - PhpStorm:算法协商失败

php - Count/Group By/Order By 只显示最常见值的计数而不是字符串本身

php - MySQL:如何将文本预先附加到现有列中的数据?

unit-testing - symfony 的 PHPUnit Mock RequestStack

python - 如何模拟具有设定大小的文件对象?

c# - 模拟接口(interface)的特定类实例

javascript - POST 后 PHP 中对象的值与通过 Ajax 发送的值不匹配?

php - eloquent-sluggable build_from 被忽略了

php - 运行时异常 : Unable to guess the Kernel directory

PHPUnit:验证数组是否具有给定值的键