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
相关产品推荐
相关产品推荐

