automattic/patchwork-redefine-exit

使用 antecedent/patchwork 重新定义 `exit` 和 `die`,以实现更健壮的 PHPUnit 测试。

v1.0.1 2024-08-23 14:28 UTC

This package is auto-updated.

Last update: 2024-09-18 03:17:54 UTC


README

本包使用 antecedent/patchwork 重新定义 exitdie,以实现更健壮的 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()。您可能需要使用启动文件或类似机制。

如果测试框架本身以错误的方式调用 exitdie(例如,在测试运行结束时使用适当的退出代码终止),您可以扩展 Automattic\RedefineExit 并实现 ignoreExitCall() 方法来识别并忽略此类调用。

用法

如果一切设置正确,对 exitdie 的调用将抛出一个 Automattic\RedefineExit\ExitException 实例,而不是退出。如果没有捕获或预期(使用 PHPUnit 的 expectException() 和相关方法),则测试将优雅地失败,并显示有关未捕获异常的消息。

异常上的消息将描述 exitdie 的调用方式,而代码将与进程将退出的代码相匹配。

如果在您的测试中捕获了异常,您可以通过检查 $ex->getFunction() 来确定它是 exit 还是 die,并且您可以通过 $ex->getArgument() 访问传递的实际参数。

注意事项

除了 Patchwork 本身重新定义内置函数的限制外,请注意应避免使用 Patchwork 的 restoreAll() 函数,因为它还会恢复退出处理程序。为了避免由此引起的问题,我们通常使用“过期”处理程序来设置我们的 exitdie 重新定义,这些处理程序将在调用 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 版(或更高版本) 下授权