Laravelのテストで2回ログインしようとしたらエラーが出た件

  • URLをコピーしました!

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回目だとエラーになる的なもの?
ソースコード追いかけたら、また追記します

ツチノコテクノロジーでは一緒に働く仲間を募集しています!

完全リモートで働きたい方へ!

詳しくは以下をご覧ください。

ツチノコテクノロジー採用サイト

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

yfukudaのアバター yfukuda 取締役・システムエンジニア

ツチノコテックアカデミアの記事は、社内で誰かが質問してくれたことに回答したときに、ついでに記載しています!(^^)/
みんなの悩みを共有すれば、きっと誰かの役に立つと信じて更新しています!

目次