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

Laravel文件上传测试报错:无法找到文件路径,断言失败

解决文件上传测试中"Unable to find a file at path"的问题

嘿,我一眼就看出问题出在哪了——你的测试断言的文件路径和控制器实际存储的路径完全不匹配,再加上磁盘名的小误用,导致测试找不到文件。下面一步步帮你搞定:

1. 修正磁盘名称的错误用法

Laravel里的磁盘标识是配置好的(参考config/filesystems.php里的disks数组),public是官方预设的磁盘名,不需要加斜杠。所以你测试里的:

Storage::fake('/public');

得改成:

Storage::fake('public');

对应的断言部分的磁盘名也要改成public,别带斜杠。

2. 匹配控制器的实际存储路径

看你的控制器代码,文件是存在file子目录下的:

$request->file('image')->store('file', '/public')

这意味着文件最终存在public/file/[随机生成的哈希文件名]这个路径,而不是public磁盘的根目录。你之前只用到了$file->hashName(),但没加file/这个前缀,所以测试自然找不到。

把测试里的断言代码改成这样:

// 原来的错误写法
Storage::disk('/public')->assertExists($file);
// 修正后的正确写法
Storage::disk('public')->assertExists('file/' . $file->hashName());

3. 额外提醒:控制器里的未定义变量问题

顺带提一句,你的控制器store方法里有几个未定义的变量:$user、$assortment,这在实际运行时会直接报错,建议修正成这样:

public function store(Request $request) { 
    // 先获取当前登录用户
    $user = auth()->user();
    
    // 建议先做请求验证,比如:
    // $validated = $request->validate([
    //     'image' => 'required|image',
    //     'title' => 'required|string',
    //     // 其他字段验证规则
    // ]);
    
    // 创建分类模型
    $assortment = Assortment::create([ 
        'file' => $request->file('image')->store('file', 'public'), 
        'user_id' => $user->id, 
        'category_id' => $request->input('category_id'), // 从请求里拿分类ID
        'title' => $request->input('title'),
        'description' => $request->input('description') 
    ]); 
    
    if ($request->wantsJson()) { 
        return response([], 204); 
    } 
    
    return redirect()->route('assortments.show', $assortment->slug) 
        ->with('success','Verzameling is succesvol aangemaakt.'); 
}

做完这些修改后,你的测试应该就能顺利通过了——现在测试查找文件的路径和控制器实际存储的路径完全一致,磁盘名也正确了。

内容的提问来源于stack exchange,提问作者Parsa Gholamhossein

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:03:25