PHP8.3
Laravel 11
UnitTestにて、1つのテスト関数内で、2回ログインさせようとしたらエラーが出ました
エラーの内容
[2024-06-25 10:45:46] local.INFO: SQL {"sql":"select count(*) as aggregate from `users` where `email` = 'contact@tutinoko.tech'","time":"0.44 ms"}
[2024-06-25 10:45:46] local.ERROR: Method Illuminate\Auth\RequestGuard::attempt does not exist. {"userId":1,"exception":"[object] (BadMethodCallException(code: 0): Method Illuminate\\Auth\\RequestGuard::attempt does not exist. at /var/www/html/vendor/laravel/framework/src/Illuminate/Macroable/Traits/Macroable.php:115)
[stacktrace]
#0 /var/www/html/vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php(341): Illuminate\\Auth\\RequestGuard->__call('attempt', Array)
#1 /var/www/html/app/Http/Controllers/AuthController.php(83): Illuminate\\Auth\\AuthManager->__call('attempt', Array)
#2 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): App\\Http\\Controllers\\AuthController->login(Object(App\\Http\\Requests\\LoginRequest))
#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(43): Illuminate\\Routing\\Controller->callAction('login', Array)
#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Route.php(260): Illuminate\\Routing\\ControllerDispatcher->dispatch(Object(Illuminate\\Routing\\Route), Object(App\\Http\\Controllers\\AuthController), 'login')
#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Route.php(206): Illuminate\\Routing\\Route->runController()
#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(806): Illuminate\\Routing\\Route->run()
#7 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#8 /var/www/html/app/Http/Middleware/TraceLog.php(31): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
UnitTestの記述
/**
* ダッシュボードのステータスデータの取得
*/
public function testStats(): void
{
Mail::fake();
// ログインしていないとエラー
$response = $this->getJson('/api/me/stats')->assertStatus(401);
// ログイン成功 会社に所属しているユーザー
$response = $this->postJson('/api/login', [
'email' => 'tt@tutinoko.tech',
'password' => 'password',
])->assertStatus(200);
$this->accessToken = $response->json('token');
// ステータス情報取得成功
$response = $this->getJson('/api/me/stats', [
'Authorization' => 'Bearer '.$this->accessToken
])->assertStatus(200);
// ログイン成功 会社に所属していないユーザー
$response = $this->postJson('/api/login', [
'email' => 'contact@tutinoko.tech',
'password' => '12345678901234567890',
])->assertStatus(200);
$this->accessToken = $response->json('token');
// ステータス情報取得成功
$response = $this->getJson('/api/me/stats', [
'Authorization' => 'Bearer '.$this->accessToken
])->assertStatus(200);
}
ログイン処理
class AuthController extends Controller
{
/**
* ログイン
*
* ログイン処理を実施します
* ログイン処理はトークンの発行を行います
*/
public function login(LoginRequest $request)
{
$validated = $request->validated();
if (!auth()->attempt($validated, true)) {
return response()->noContent(401);
}
// ログインメールを送信する
Mail::send(new LoginMail(
user: auth()->user(),
));
$token = auth()->user()->createToken('auth_token')->plainTextToken;
return response()->json(['token' => $token]);
}
原因は auth()->attempt
2回目だとエラーになる的なもの?
ソースコード追いかけたら、また追記します