automattic / patchwork-redefine-exit
使用 antecedent/patchwork 重新定义 `exit` 和 `die`,以实现更健壮的 PHPUnit 测试。
Requires
- php: >=7.0
- antecedent/patchwork: ^2.1
Requires (Dev)
- automattic/jetpack-changelogger: ^4.2.6
- yoast/phpunit-polyfills: ^1.1.1
This package is auto-updated.
Last update: 2024-09-18 03:17:54 UTC
README
本包使用 antecedent/patchwork 重新定义 exit
和 die
,以实现更健壮的 PHPUnit 测试。
安装
需要使用 composer require --dev automattic/patchwork-redefine-exit
进行安装。
配置
您需要配置 Patchwork 允许重新定义 exit()
和 die()
,通过在您的 patchwork.json
中设置 redefinable-internals
来实现。至少应该像这样:
{ "redefinable-internals": [ "exit", "die" ] }
(您可以将 patchwork.json
放在与您的 PHPUnit bootstrap 文件相同的目录中)。
您还需要配置 PHPUnit 以加载 Patchwork 和此包,这通常通过在您的 PHPUnit bootstrap 文件中包含类似以下内容来实现。
// Require Patchwork. require_once __DIR__ . '/../vendor/antecedent/patchwork/Patchwork.php'; // Enable Automattic/patchwork-redefine-exit. \Automattic\RedefineExit::setup();
与其他测试框架一起使用
对于其他测试框架,您需要在加载任何待测试代码之前加载 Patchwork,并在运行任何测试之前调用 Automattic\RedefineExit::setup()
。您可能需要使用启动文件或类似机制。
如果测试框架本身以错误的方式调用 exit
或 die
(例如,在测试运行结束时使用适当的退出代码终止),您可以扩展 Automattic\RedefineExit
并实现 ignoreExitCall()
方法来识别并忽略此类调用。
用法
如果一切设置正确,对 exit
或 die
的调用将抛出一个 Automattic\RedefineExit\ExitException
实例,而不是退出。如果没有捕获或预期(使用 PHPUnit 的 expectException()
和相关方法),则测试将优雅地失败,并显示有关未捕获异常的消息。
异常上的消息将描述 exit
或 die
的调用方式,而代码将与进程将退出的代码相匹配。
如果在您的测试中捕获了异常,您可以通过检查 $ex->getFunction()
来确定它是 exit
还是 die
,并且您可以通过 $ex->getArgument()
访问传递的实际参数。
注意事项
除了 Patchwork 本身重新定义内置函数的限制外,请注意应避免使用 Patchwork 的 restoreAll()
函数,因为它还会恢复退出处理程序。为了避免由此引起的问题,我们通常使用“过期”处理程序来设置我们的 exit
和 die
重新定义,这些处理程序将在调用 Patchwork\restoreAll()
时终止进程(并显示有用的消息)。如果您想恢复除了我们之外的所有处理程序,提供了一个替换函数 Automattic\RedefineExit::restoreAll()
。或者,如果您想完全避免过期处理程序,请使用 Automattic\RedefineExit::setupDangerously()
而不是 ::setup()
。在这种情况下,您可能需要在每次调用 Patchwork\restoreAll()
时再次调用 ::setupDangerously()
。
安全性
需要报告安全漏洞?请访问 https://automattic.com/security/ 或直接访问我们的安全漏洞赏金计划网站 https://hackerone.com/automattic。
许可证
patchwork-redefine-exit 在 GNU 通用公共许可证第 2 版(或更高版本) 下授权