You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 02:09:04