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

Laravel 11升级后Passport::actingAs单元测试报错求助

解决Laravel 11升级后Passport测试报NOT NULL约束失败的问题

1. 先确认Passport版本兼容

Laravel 11要求Passport至少是12.0版本,先查看你的composer.json里Passport的版本号,如果低于12.x,执行升级命令:

composer require laravel/passport:^12.0

2. 修改测试代码,手动生成Token

原来的Passport::actingAs($this->user)在Laravel 11里可能无法正确生成带有效ID的Token,你可以改成手动创建Token再传入:

方式一:给actingAs传Token实例

// 给用户创建一个测试用Token
$token = $this->user->createToken('test-token')->token;

// 将Token实例一起传给actingAs
Passport::actingAs($this->user, [], $token);

$response = $this->get('/api/users');
$response->assertStatus(200);

方式二:用actingAsWithToken直接传Token字符串

// 获取用户的Access Token字符串
$accessToken = $this->user->createToken('test-token')->accessToken;

// 直接用该Token完成登录模拟
Passport::actingAsWithToken($accessToken);

$response = $this->get('/api/users');
$response->assertStatus(200);

3. 检查测试数据库的迁移是否到位

如果测试数据库未执行Passport的迁移,表结构缺失会触发约束错误:

  • 在测试类中使用RefreshDatabase trait,确保每次测试前重置数据库并执行所有迁移:
use Illuminate\Foundation\Testing\RefreshDatabase;

class UserApiTest extends TestCase
{
    use RefreshDatabase;

    protected function setUp(): void
    {
        parent::setUp();
        // 若默认迁移未包含Passport的迁移,显式执行
        $this->artisan('migrate', ['--path' => 'vendor/laravel/passport/database/migrations']);
    }

    // 你的测试方法...
}

4. 核对Passport配置(可选)

如果上述方法无效,检查config/passport.php中的Token模型配置是否正确,确保模型主键类型与迁移文件一致:

// config/passport.php
'token_model' => Laravel\Passport\Token::class,

要是你自定义了Token模型,需保证id字段的类型(如自增ID或UUID)与迁移中的设置匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 10:32:46