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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 05:36:04