Laravel 8 HTTP测试报Failed asserting that two strings are equal问题咨询
问题原因
出现该错误的核心原因是注册请求未按预期执行到成功后跳转/signin的逻辑,触发了默认重定向规则,具体可能的触发点如下:
- 表单验证失败:Laravel POST请求验证不通过时,默认会重定向到上一级页面(你这里即根路径
http://localhost),常见触发点包括你提交的email字段值为email@email,不符合合法邮箱格式要求;缺少注册逻辑要求的password_confirmation确认密码字段;Select字段名和后端要求的字段名不匹配等。 - 测试存放目录错误:你将HTTP测试放在了Unit 单元测试目录下,Laravel 单元测试默认不会初始化Web中间件(Session、验证重定向等逻辑都不会生效),HTTP功能测试需要放在
tests/Feature目录下才能匹配实际运行环境。 - 注册逻辑分支未命中:存在用户名/邮箱重复、权限校验不通过等前置判断失败的情况,逻辑提前返回重定向到首页,未走到注册成功跳转
/signin的分支。
修复方案
按照以下步骤逐一排查修复即可:
- 先打印验证错误定位具体问题,在
post请求后、assertRedirect前加入调试代码:
// 打印Session中的验证错误信息 dd($response->getSession()->get('errors')); // 也可以临时关闭异常拦截,直接查看接口抛出的具体错误 $this->withoutExceptionHandling();
- 修正测试提交的参数,匹配后端验证规则:
public function test_http(){ // 跳过CSRF验证避免拦截 $this->withoutMiddleware(\App\Http\Middleware\VerifyCsrfToken::class); $response = $this->post('/SignUp',[ 'id'=>'4', 'first_name'=>'name', 'middle_name'=>'name', 'family_name'=>'name', 'password'=>'password', 'password_confirmation' => 'password', // 补充确认密码字段 'gender'=>'male', 'work'=>'work', // 修正字段名和后端要求一致,比如如果后端要求小写就改为select 'select'=>'Software Engneering', // 加随机后缀避免用户名/邮箱重复 'username'=>'username_'.uniqid(), // 修正为合法邮箱格式 'email'=>'email@example.com' ]); $response->assertRedirect('/signin'); }
- 将测试文件从
tests/Unit目录移动到tests/Feature目录,确保Web中间件正常加载。 - 检查注册接口的后端代码,确认注册成功的分支确实返回了
return redirect('/signin'),不存在其他跳转逻辑。
内容的提问来源于stack exchange,提问作者randomman
相关产品推荐
相关产品推荐

