如何为文件下载创建PHP-Unit测试?

mic*_*mut 8 php phpunit unit-testing

经过长时间思考这个主题没有结果,我希望有人可以给我一个关于下载phpUnit-Test的提示.如何为此函数创建一个phpUnit测试,该测试执行zip-File的下载?或者是否有通常的做法来测试这样的逻辑?

   public function createOutput($zipFolderName) {
        $zipFolderName = $zipFolderName."/imageResizer.zip";
        header('Content-Type: application/zip');
        header('Content-disposition: attachment; filename=' . $zipFolderName);
        header('Content-Length: ' . filesize($zipFolderName));
        readfile($zipFolderName);
    }
Run Code Online (Sandbox Code Playgroud)

dm0*_*514 5

我觉得这个功能有几个组件,每个部分都应该进行测试以确保它正确完成:

  • 建立正确的$zipFolderName路径
  • 设置正确的标题
  • 计算正确的文件大小
  • 读取文件

看起来某种文件处理程序抽象可以帮助您轻松地对该方法进行单元测试。

class FileUtils {
   public getDownloadFileName($folderName) {}
   public getFileSize($file) {}
   public readFile($file) {}
}
Run Code Online (Sandbox Code Playgroud)

现在您可以将文件实用程序实例注入到您的函数中。对于您的生产代码,此类会将文件操作委托给实际文件系统,但您的测试将提供一个存根/模拟,允许您断言您的单元正在执行预期的操作。

 public function createOutput($fileUtilsInstance, $zipFolderName) {
        $zipFolderName = $fileUtilsInstance->getDownloadFileName($zipFolderName);
        header('Content-Type: application/zip');
        header('Content-disposition: attachment; filename=' . $zipFolderName);
        header('Content-Length: ' . $fileUtilsInstance->getFilesize($zipFolderName));
        $fileUtilsInstance->readFile($zipFolderName);
    }
Run Code Online (Sandbox Code Playgroud)

相同的策略可以应用于该header方法。