php - 使用 PHPUnit 在 php 中测试关闭例程 (register_shutdown_function)

标签 php phpunit

我有一个 File 类,带有 ->deleteOnExit 函数。如果调用此函数,文件将在关闭时自行删除。 File 类使用 register_shutdown_function 函数来实现此目的,在运行关闭处理程序时删除文件。问题是,我如何在 PHPUnit 中测试它。我试过了

$file = new File(__DIR__ . "/delete_on_exit.txt");
$file->createFile();
$file->deleteOnExit();
register_shutdown_function(function() use ($file) {
    $this->assertFalse($file->exists());
});

但这并没有奏效。我猜这是因为在调用注册到 register_shutdown_function 的函数时,PHPUnit 已经完成了测试。

有办法吗?

最佳答案

您应该在内部使用 tmpfile() ( documentation ) 而不是使用关闭函数删除文件。

此外,根据 PHPUnit 的工作方式,您无法测试正确的关机删除。 PHPUnit 测试在一个巨大的“应用程序”中运行——任何关闭函数只会在最后一个测试完成并且任何其他任务(如生成代码覆盖率)完成时才会被调用。此时,您的测试报告该文件确实已被删除已经太迟了。

此外,正因为如此,我怀疑您的代码是否会可靠地删除文件,因为任何其他注册的仅调用 exit() 的关闭函数都会阻止您的关闭函数删除文件。使用 tmpfile() 时,所有这些问题似乎都不存在,因为这是操作系统支持的调用,如果打开文件的进程由于某种原因终止,该调用将删除文件。

关于php - 使用 PHPUnit 在 php 中测试关闭例程 (register_shutdown_function),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22819119/

相关文章:

php - 将大型 json 字符串存储到数据库 + 哈希

php - Codeigniter配置文件加载

PHP AJAX POST 获取错误数据

php - PHP 调试包的用途

laravel - 使用 laravel 8 测试上传文件,assertExists 不起作用

php - 表单提交的两种不同操作

Laravel 功能测试。缓存模拟不起作用! CacheManager::driver(),但未指定预期

php - 如何将一组测试用例发送到 PHPUnit willReturnOnConsecutiveCalls

PHPUnit:死后继续,期望 "die"或以某种方式处理 die()?

unit-testing - 如何使用 phpunit 对无效参数进行单元测试?