php-mock/php-mock-phpunit

使用PHPUnit模拟内置PHP函数(例如time())。此包依赖于PHP的命名空间回退策略。无需进一步扩展。

2.10.0 2024-02-11 07:24 UTC

README

.github/workflows/tests.yml

使用PHPUnit模拟PHP内置函数

此包将函数模拟库PHP-Mock与PHPUnit集成。

安装

使用Composer

composer require --dev php-mock/php-mock-phpunit

使用方法

PHP-Mock将特性PHPMock集成到您的PHPUnit测试用例中。此特性通过方法getFunctionMock()扩展了框架。通过此方法,您可以以您习惯的方式构建模拟

namespace foo;

class BuiltinTest extends \PHPUnit\Framework\TestCase
{

    use \phpmock\phpunit\PHPMock;

    public function testTime()
    {
        $time = $this->getFunctionMock(__NAMESPACE__, "time");
        $time->expects($this->once())->willReturn(3);

        $this->assertEquals(3, time());
    }

    public function testExec()
    {
        $exec = $this->getFunctionMock(__NAMESPACE__, "exec");
        $exec->expects($this->once())->willReturnCallback(
            function ($command, &$output, &$return_var) {
                $this->assertEquals("foo", $command);
                $output = ["failure"];
                $return_var = 1;
            }
        );

        exec("foo", $output, $return_var);
        $this->assertEquals(["failure"], $output);
        $this->assertEquals(1, $return_var);
    }
}

无需禁用被模拟的函数。PHPUnit的集成会为您完成。

限制

此库包含与底层php-mock相同的限制

  • 只有命名空间上下文中的未限定函数调用可以被模拟。例如,在命名空间foo中对time()的调用是可模拟的,而对\time()的调用则不是。

  • 模拟必须在测试类中对未限定函数的第一次调用之前定义。这在Bug #68541中有文档说明。在大多数情况下,您可以忽略此限制。但如果您遇到此问题,可以在第一次调用之前调用PHPMock::defineFunctionMock()(例如,使用@beforeClass)。这将定义一个无副作用的作用域函数。另一种有效的方法是在隔离进程中运行测试(例如,使用@runInSeparateProcess)。

许可证和作者

此项目是免费的,受WTFPL许可。此项目的负责人是Markus Malkusch [email protected]

捐赠

如果您喜欢此项目,并且愿意慷慨捐赠,请在这里捐赠一些比特币:1335STSwu9hST4vcMRppEPgENMHD2r1REK