【问题标题】:How to create a PHP-Unit test for a file download?如何为文件下载创建 PHP 单元测试?
【发布时间】:2017-01-04 18:59:59
【问题描述】:

想了很久这个话题没有结果,希望有人能给我一些关于phpUnit-Test下载的提示。如何为这个函数创建一个 phpUnit 测试,它执行一个 zip 文件的下载?或者是否有其他通常的做法来测试这样的逻辑?

   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);
    }

【问题讨论】:

    标签: php unit-testing phpunit


    【解决方案1】:

    我建议你vfsStream图书馆:

    vfsStream 是一个用于虚拟文件系统的 PHP 流包装器,它可以 有助于在单元测试中模拟真实的文件系统。可以使用 使用任何单元测试框架,例如 PHPUnit 或 SimpleTest。

    同样有用的信息:

    希望对您有所帮助。如果您需要一些示例,请告诉我

    【讨论】:

    【解决方案2】:

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

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

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

    class FileUtils {
       public getDownloadFileName($folderName) {}
       public getFileSize($file) {}
       public readFile($file) {}
    }
    

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

     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);
        }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-22
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      • 1970-01-01
      • 1970-01-01
      • 2012-01-04
      • 1970-01-01
      相关资源
      最近更新 更多