Laravel+Passportの処理をphpunitでテストする際、同じテスト中に別アカウントで認証する方法

参考)https://teratail.com/questions/235251

結論からいうと、

$this->refreshApplication()

使いました。参考サイトに記載されている通り、flushHeaders()等行って、withHeadersで、異なるtokenをセットしても、最初にリクエストを投げたユーザーで認証が通ってしまって意図した動作になりません。

一度、refreshApplicationをして、完全に初期化してしまうと、別のユーザーで認証されました。

// sample

$user = User::find(1);
$token = $user->createToken()->accessToken;

$header = [
  'Accept' => 'application/json',
  'Content-Type' => 'application/json',
  'Authorization' => 'Bearer ' . $token,
];

$user2 = User::find(2);
$token2 = $user->createToken()->accessToken;

$header2 = [
  'Accept' => 'application/json',
  'Content-Type' => 'application/json',
  'Authorization' => 'Bearer ' . $token2,
];

// user 1 で処理される
$response = $this->withHeaders($header)
  ->json('GET', '<url>');

// user 2 で処理されない
// $this->flushHeaders();  // これも意味がない
// $this->withHeader('Authorization', 'Bearer ' . $token2); // これも意味がない
$response = $this->withHeaders($header2)
  ->json('GET', '<url>');

// refreshApplicationを行って、user2でアクセスするとうまくいく
$this->refreshApplication()
$response = $this->withHeaders($header2)
  ->json('GET', '<url>');

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

おすすめ