Laravel 10中assertRedirect()带URI参数时测试失败的问题排查
问题排查与解决方案
你的问题核心大概率出在控制器跳转逻辑或测试URL生成方式上,以下是具体排查和解决方向:
控制器验证失败后的跳转逻辑错误
当表单验证失败时,若你没显式指定跳转地址,Laravel默认会调用redirect()->back()。但测试环境里的POST请求没有携带Referer头,此时back()会默认跳转到根路径http://localhost——这就解释了为啥不加URI参数时测试能过(只断言跳转动作存在,不校验地址),加了就失败。解决办法:在控制器里显式指定验证失败后的跳转地址,用路由命名生成正确URL,比如在
GroupController的store方法里:$validator = Validator::make($request->all(), [ 'name' => 'required|string', // 其他验证规则 ]); if ($validator->fails()) { // 用路由命名生成跳转地址,确保参数正确传递 return redirect()->route('schools.groups.create', ['school' => $request->route('school')]) ->withErrors($validator) ->withInput(); }要是用FormRequest类,也可以在
failedValidation方法里重写跳转逻辑。测试中URL生成方式不严谨
手动拼接的$redirect字符串可能和路由实际生成的URL有细微差异(比如末尾斜杠、参数格式)。你定义的嵌套资源路由对应的创建路由命名是schools.groups.create,测试里应该用路由助手生成URL,而非硬拼:$redirect = route('schools.groups.create', ['school' => $this->school->id]); $this->post($this->url)->assertInvalid(['name'])->assertRedirect($redirect);这样能保证测试用的URL和控制器跳转的URL完全一致,避免硬拼带来的错误。
额外排查点:请求路由参数是否正确
确认$this->url对应的是schools/{school}/groups的POST路由,且请求中正确传递了school参数,否则控制器里$request->route('school')取不到值,会导致跳转地址错误。
内容的提问来源于stack exchange,提问作者Dom
相关产品推荐
相关产品推荐

