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

使用Sanctum测试Laravel API路由时触发完整性约束违反

问题原因

你用Sanctum::actingAs()做测试认证时,这个方法只是模拟用户已登录的状态,并不会在数据库里创建真实的personal_access_token记录。而你的日志系统在记录请求时,试图把不存在的token ID(默认值0)写入personal_access_token_logs表,触发了外键约束报错。

解决方案

有两种处理方式,选适合你的:

1. 测试时创建真实的访问令牌

放弃Sanctum::actingAs(),手动创建token并通过请求头传递,这样日志系统能拿到有效的token ID:

it('can show {hidden_route}', function () {
    $user = User::factory()->create(['is_admin' => true]);
    // 创建真实的个人访问令牌
    $plainToken = $user->createToken('test-auth-token')->plainTextToken;

    // 携带Bearer令牌发起请求
    $response = $this->withHeaders([
        'Authorization' => "Bearer {$plainToken}"
    ])->getJson('/api/{hidden_route}');
    
    $response->assertStatus(200);
});

2. 调整日志逻辑适配测试场景

如果不想改测试代码,可以修改日志记录的逻辑:

  • 检查当前请求的认证是否来自模拟的actingAs(通过判断request()->user()->currentAccessToken()是否为null),如果是则跳过日志记录;
  • 或者修改personal_access_token_logs表的结构,把personal_access_token_id字段设为可空,同时更新外键约束允许null值(这样没有token时该字段存null,不会触发报错)。

内容的提问来源于stack exchange,提问作者Eduardo Corrales

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 22:54:50