使用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
相关产品推荐
相关产品推荐

