【发布时间】:2023-03-17 03:10:01
【问题描述】:
在一个项目中我发现了这样的代码行:
protected function save($content, $path)
{
// ...
if (($handler = @fopen($path, 'w')) === false) {
throw new Exception('...');
}
// ...
if (@fwrite($handler, $content) === false) {
throw new Exception('...');
}
// ...
@fclose($handler);
}
我想用 PHPUnit 测试这个方法,但我有点坚持正确的测试用例。如果我将通过不正确的$path 或正确的$path,但权限不正确(例如0444),那么一切都会在第一个异常处停止。如果我以正确的权限传递正确的$path,那么 PHP 也将能够写入文件,并且不会遇到第二个异常。
那么有没有什么方法可以在不重写这个方法的情况下测试第二个异常呢?
或者最好在一种情况下同时检查fopen 和fwrite 并为两者只使用一个例外?
或者最好的选择是将这个方法分成两种——一种用于打开,一种用于编写——并分别测试?
【问题讨论】:
-
我会使用模拟的 $path,请参阅 phpunit.de/manual/current/en/… - 使用 vfsStream 您可以设置虚拟磁盘配额,这应该(尽管硬件故障)是 fwrite 返回 false 的最常见原因。 vfsStream::setQuota() 是首选方法。
-
@l-x 你的评论应该是一个答案:)
-
是的,我可以肯定地接受它:) 很好的测试包。
-
所以我写了一个小答案;)