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的迁移,表结构缺失会触发约束错误:
- 在测试类中使用
RefreshDatabasetrait,确保每次测试前重置数据库并执行所有迁移:
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
相关产品推荐
相关产品推荐

