Shopware 6 如何将单元测试输出从fixture路由到原始目录?
解决方案
1. 路径依赖注入(优先推荐)
- 不要在公共函数中硬编码
public/downloads的绝对路径,将下载根目录作为可配置入参,默认值设置为生产环境的public目录路径 - 单元测试调用公共函数时,直接传入fixture所在的目录作为根路径即可,无需额外模拟目录结构
- 代码示例:
// 公共函数定义 function getDownloadFile(string $fileName, string $downloadRoot = __DIR__ . '/../public/downloads') { return rtrim($downloadRoot, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . $fileName; } // 单元测试中调用 $testFilePath = getDownloadFile('test_case_1.txt', __DIR__ . '/fixtures/downloads');
2. 虚拟文件系统Mock(适合无法修改原有函数的场景)
- 用单元测试对应的虚拟文件系统扩展(比如PHPUnit的
vfsStream),在内存中构造和生产环境完全一致的public/downloads目录层级,把fixture文件的内容写入对应虚拟路径 - 无需修改原有业务代码,也不会在本地生成冗余测试文件
- 代码示例:
// 单元测试初始化虚拟目录 $vfsRoot = vfsStream::setup('public'); vfsStream::newDirectory('downloads') ->at($vfsRoot) ->addChild( vfsStream::newFile('test_case_1.txt') ->withContent(file_get_contents(__DIR__ . '/fixtures/test_case_1.txt')) ); // 直接调用原有公共函数即可拿到对应测试文件 $resultContent = file_get_contents(getDownloadFile('test_case_1.txt'));
3. 临时目录软链接(适合需要真实文件系统交互的场景)
- 测试启动前,在本地临时目录创建和生产环境结构完全一致的
public/downloads目录,将fixture文件夹的所有内容软链接到该临时目录下 - 测试执行完成后自动清理临时目录即可
注意:该方案需要测试执行环境有创建软链接的权限,跨平台使用时要注意Windows系统的软链接兼容性问题
内容的提问来源于stack exchange,提问作者Dhaval Kanojiya
相关产品推荐
相关产品推荐

