Zenn
🦁

Laravel×Reactのログイン機能のPHPUnitでのテスト実装の流れ

2025/03/16に公開

Laravelでログイン機能のテストを、本番用DBに影響を与えずに実行するための手順です。


1. phpunit.xmlでテスト用DBの設定を行う

phpunit.xmlに以下の環境変数を追加します。これにより、テスト実行時はtest_dbに接続されます。

<php>
    <env name="APP_ENV" value="testing"/>
    <env name="DB_CONNECTION" value="mysql"/>
    <env name="DB_DATABASE" value="test_db"/>
    <env name="DB_HOST" value="db"/>
    <env name="DB_PORT" value="3306"/>
    <env name="DB_USERNAME" value="root"/>
    <env name="DB_PASSWORD" value="root"/>
</php>

2. .env.testingを作成

テスト用の環境変数ファイル.env.testingを作成し、以下を記載します。

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=test_db
DB_USERNAME=root
DB_PASSWORD=root

📌 これにより、php artisan testまたはphpunit実行時にtest_dbが使用されるようになります。


3. 実際のAuthControllerコード

<?php

namespace App\Http\Controllers\API;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\User;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Validator;

class AuthController extends Controller
{
    public function login(Request $request)
    {
        $request->validate([
            'email' => 'required|email',
            'password' => 'required',
        ]);

        $user = User::where('email', $request->email)->first();

        if (!$user || !Hash::check($request->password, $user->password)) {
            return response()->json(['message' => 'Unauthorized'], 401);
        }

        $token = $user->createToken('auth_token')->accessToken;

        return response()->json(['token' => $token]);
    }

    public function register(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'name' => 'required|string|max:255',
            'email' => 'required|string|email|max:255|unique:users',
            'password' => 'required|string|min:6|confirmed',
        ]);

        if ($validator->fails()) {
            return response()->json(['errors' => $validator->errors()], 422);
        }

        $user = User::create([
            'name' => $request->get('name'),
            'email' => $request->get('email'),
            'password' => Hash::make($request->get('password')),
        ]);

        return response()->json(['message' => 'User created successfully', 'user' => $user], 200);
    }
}

4. テストコードの例

tests/Feature/AuthControllerTest.php に以下のようなテストコードを作成します。

<?php

namespace Tests\Feature;

use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class AuthControllerTest extends TestCase
{
    use RefreshDatabase;

    public function test_user_can_register()
    {
        $response = $this->postJson('/api/register', [
            'name' => 'Test User',
            'email' => 'test@example.com',
            'password' => 'password',
            'password_confirmation' => 'password',
        ]);

        $response->assertStatus(200)
                 ->assertJson(['message' => 'User created successfully']);
    }

    public function test_user_can_login()
    {
        $user = User::factory()->create([
            'email' => 'test@example.com',
            'password' => bcrypt('password'),
        ]);

        $response = $this->postJson('/api/login', [
            'email' => 'test@example.com',
            'password' => 'password',
        ]);

        $response->assertStatus(200)
                 ->assertJsonStructure(['token']);
    }
}
  • use RefreshDatabase: テストごとにDBをリセットして、クリーンな状態にします。
  • postJson(): APIに対してPOSTリクエストを送信。
  • assertStatus(): レスポンスのステータスコードを検証。
  • assertJson() / assertJsonStructure(): レスポンスのJSONデータを検証。

5. テスト用DBのマイグレーション

テスト実行前に、テスト用DBにマイグレーションを適用します。

php artisan migrate --env=testing

6. テストの実行方法

以下のコマンドでテストを実行します。

php artisan test

または

phpunit

7. 実行結果の例

PASS  Tests\Feature\AuthControllerTest
✓ ユーザー登録が成功する
✓ ユーザーがログインできる

現在の環境とDB接続情報をログに出力する

use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\DB;

Log::info('Current Environment', ['env' => app()->environment()]);
Log::info('DB Connection', ['db' => DB::connection()->getDatabaseName()]);

ログの確認

storage/logs/laravel.log に次のような情報が記録されます。

[2025-03-16 16:30:00] local.INFO: Current Environment {"env":"testing"}
[2025-03-16 16:30:00] local.INFO: DB Connection {"db":"test_db"}

もし.envの変更が反映されない場合は

キャッシュをクリアして再読み込みしましょう!

php artisan config:clear
php artisan cache:clear

これで、「どの環境のDBに接続しているか」と「現在のLaravel環境」を明確に確認できます!

これで、本番DBに影響を与えずに安全にテストが実行できます! 🚀

Discussion

ログインするとコメントできます