php-mock / php-mock-phpunit
使用PHPUnit模拟内置PHP函数(例如time())。此包依赖于PHP的命名空间回退策略。无需进一步扩展。
2.10.0
2024-02-11 07:24 UTC
Requires
- php: >=7
- php-mock/php-mock-integration: ^2.3
- phpunit/phpunit: ^6 || ^7 || ^8 || ^9 || ^10.0.17 || ^11
Requires (Dev)
- mockery/mockery: ^1.3.6
README
使用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