特征
用户模型的特征有时会引起混淆。
Sanctum和Passport都带有相同的Trait,称为HasApiToken
。
您可能需要更改用户模型中的命名空间:
从
use Laravel\Sanctum\HasApiTokens;
to
use Laravel\Passport\HasApiTokens;
使用PAC进行测试
在实现单元测试时,您可以创建一个测试来创建个人访问客户端(personal-access-client)
:
如果您在数据库中哈希密码,请在测试用例中将Passport::$hashesClientSecrets
设置为false
,以便获取未散列的密码。
use RefreshDatabase
/** @test */
public function can_create_a_personal_access_client()
{
Passport::$hashesClientSecrets = false;
$this->artisan(
'passport:client',
['--name' => config('app.name'), '--personal' => null]
)->assertSuccessful();
$this->assertDatabaseCount(PersonalAccessClient::class,1);
}
因为我们使用了RefreshDatabase
特性,所以为其他可能需要personal-access-client
的测试创建一个帮助特性非常有用:
<?php
namespace Tests;
use App\Models\User;
use Illuminate\Testing\TestResponse;
trait Helper
{
protected function createPersonalClient()
{
Passport::$hashesClientSecrets = false;
$this->artisan(
'passport:client',
['--name' => config('app.name'), '--personal' => null]
);
return DB::table('oauth_clients')
->where('personal_access_client','=',true)
->first();
}
}
现在,您可以将该类用于其他PAT测试:
use RefreshDatabase, Helper;
public function can_issue_a_personal_access_token()
{
$this->createPersonalClient();
$user = User::factory()->create()->createToken('test');
$this->assertInstanceOf(PersonalAccessTokenResult::class, $user);
$this->assertObjectHasAttribute('accessToken', $user);
$this->assertObjectHasAttribute('token', $user);
}