PHPUnit:我该如何模拟这个文件系统



考虑以下场景(这不是生产代码):

 class MyClass {
    public function myMethod() {
        // create a directory
        $path = sys_get_temp_dir() . '/' . md5(rand());
        if(!mkdir($path)) {
            throw new Exception("mkdir() failed.");
        }
        // create a file in that folder
        $myFile = fopen("$path/myFile.txt", "w");
        if(!$myFile) {
            throw new Exception("Cannot open file handle.");
        }
    }
}

对,那问题出在哪里?代码覆盖率报告该行未被覆盖:

throw new Exception("Cannot open file handle.");

这是正确的,但由于我在逻辑上创建上面的文件夹,fopen()似乎不可能失败(除非是在极端情况下,比如磁盘达到100%)。

我可以忽略代码覆盖范围内的代码,但这是一种欺骗。有没有什么方法可以模拟文件系统,使其能够识别myFile.txt,并模拟无法创建文件的文件系统?

vfsStreamvirtual filesystemstream wrapper,在模拟真实文件系统的单元测试中非常有用。您可以从composer安装它。

更多信息,请访问:

https://github.com/mikey179/vfsStream

https://phpunit.de/manual/current/en/test-doubles.html

您还可以将函数分解为两个方法,一个用于创建路径,另一个用于使用路径。然后,可以进行单独的测试以确保创建路径。当您尝试使用错误的路径时,第二组测试可以检查并捕获异常。

是!

您应该以某种方式注入完整路径,不要在该方法中调用sys_get_temp_dir()。

任何不存在的路径都会引发问题。你不需要VFS。

但在触发异常之前,您会收到一个E_NOTICE(或者警告?)。因此,您可能应该首先检查is_writeable,如果返回false,则抛出异常。

最新更新