如何使用PHPunit测试只读文件访问的代码路径



我有一个PHP应用程序,其代码路径仅在指定文件为只读时触发。如果文件是可读可写的,则采用另一个代码路径。特别是,我正在努力与unlink。要测试的简化代码如下所示

try {
// do something
unlink($pathToFile);
// do more
} catch (Throwable $e) {
// recovery and alternative code if unlink failed
}

如果unlink因为文件不可写而失败,则捕获分支被占用。我已经手动创建了一个只读文件。

我的问题是用PHPunit编写一个自动测试,它在我的开发机器上运行在检查出的工作目录中,但也作为Github工作流的一部分。

我已经尝试用PHPunit创建一个示例文件,然后chmod文件到0666。不幸的是,这不会触发异常,因为如果调用用户是文件的所有者(这似乎是合理的),则文件权限似乎被绕过了。我还尝试了PHPunit中的chmod,并使0(aka root)为文件的所有者,但这失败了,因为非root用户不允许调用chmod

不管怎么说,"松散"的正确方法是什么?执行PHPunit进程和运行PHP应用程序的用户的文件访问权限?(到目前为止,我所尝试的一切似乎都是死路一条,好像不可能摆脱和扔掉自己创建的文件的权利。)

要使unlink()返回false,取消一个根本不存在的文件的链接。

单行错误处理的示例代码(在您的示例中可以替代catch/try,您也可以这样做):

$result = @unlink('/path/to/non-existing-file');
if (false === $result) {
# ...
}

如果你需要配置更多,一个允许更细粒度控制的现有工具是Vfs Stream。它甚至允许创建专用错误。

最新更新