Laravel 8 TDD测试报错:session缺少预期errors键如何解决?
问题根因
你调用的是/api/前缀的接口,默认归属Laravel的api中间件组,该组默认不会加载StartSession、ShareErrorsFromSession这两个会话相关中间件。表单验证失败时错误信息不会存入会话,所以你用assertSessionHasErrors()断言自然找不到对应错误。
排查步骤
- 确认路由配置:检查目标路由是否定义在
routes/api.php文件内,确认其所属中间件组没有包含会话相关组件 - 打印响应内容:在测试代码中添加
$response->dump(),可看到验证失败返回的是422状态码的JSON格式响应,错误信息存在响应体的errors字段中,而非会话中 - 校验断言适配性:
assertSessionHasErrors仅适配带会话的Web路由场景,API无状态场景不适用
解决方案
直接修改测试代码的断言逻辑,使用API场景专属的验证断言即可,推荐同时将普通POST请求改为JSON请求,符合接口调用规范:
/** @test */ public function email_must_be_a_valid_email() { // 改用postJson方法发送JSON格式请求 $response = $this->postJson('/api/contacts', array_merge($this->data(), ['email' => 'NOT AN EMAIL'])); // 断言返回422验证失败状态码 $response->assertStatus(422); // 断言响应中包含email字段的验证错误 $response->assertJsonValidationErrors('email'); }
如果你确实需要在API路由中使用会话(不符合RESTful无状态设计规范,不推荐),可以在app/Http/Kernel.php的$middlewareGroups['api']配置中添加会话相关中间件,再保留原有断言即可。
内容的提问来源于stack exchange,提问作者Mohsen
相关产品推荐
相关产品推荐

