ログインテストの実装手順（Laravel 9 / PHP 8）

# 🔹 前提
Laravel Breeze または Fortify などで /login が使える状態



# 手順
## ①：テストファイルを作成する
```bash
php artisan make:test LoginTest
```
作成されるファイル：
```
/tests/Feature/LoginTest.php
```


## ②：テスト内容を記述する
```/tests/Feature/LoginTest.php
<?php

namespace Tests\Feature;

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

class LoginTest extends TestCase
{
    // テストごとにデータベースをリセット
    use RefreshDatabase;

    /** @test */
    public function test_user_can_login_with_correct_credentials()
    {
        $user = User::factory()->create([
            'email' => 'test@example.com',
            'password' => bcrypt('password123'), // パスワードを設定
        ]);

        // ログインフォームに入力して送信したシュミレーション内容
        $response = $this->post('/login', [
            'email' => 'test@example.com',
            'password' => 'password123',
        ]);

        $response->assertRedirect('/counts'); // 成功時のリダイレクト先
        $this->assertAuthenticatedAs($user); // ログイン済みであることを確認
    }

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

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

        $response->assertRedirect('/login'); // 失敗後に戻る
        // 📝 「パスワードが間違ってる → バリデーションエラーが発生 → セッションに email のエラーがあるはず」と確認している。
        // 📝 Laravelでは「パスワードが間違っていても email にエラーを付ける」設計になっている
        $response->assertSessionHasErrors('email');  // セッションに email フィールドのエラーが含まれているか？
        $this->assertGuest(); // ログインしていないことを確認
    }
}
```



## ③：テスト用のDBを準備（初回のみ）
### 1. .env.testing を作る
テスト環境用の .env.testing ファイルを作ります。
これは「テスト実行時だけ使う専用の環境変数ファイル」です。
```bash
cp .env .env.testing
```
.env をコピーして .env.testing を作成


### 2. .env.testing を編集
.env.testing の DB接続情報だけをテスト用に変更します。
#### 例（SQLiteメモリDBを使う場合）
```ini
DB_CONNECTION=sqlite
DB_DATABASE=:memory:
```

#### 例（MySQLを別で用意する場合）
```ini
DB_CONNECTION=mysql
DB_DATABASE=your_test_db_name
DB_USERNAME=your_test_user
DB_PASSWORD=your_test_password
```
※ 本番DBを指定しないよう注意！テスト中に全消去されます。


### 3. テスト用DBにマイグレーションを実行
```bash
php artisan migrate --env=testing
```
🔸 これで tests 実行時にもテーブルが使えるようになります。



### 4. RefreshDatabase トレイトの利用確認
テストファイルにこれがある場合：
```php
use Illuminate\Foundation\Testing\RefreshDatabase;
```
→ 毎回テスト前に自動で migrate:fresh 相当が実行されるため、
実際のテストでは 毎回マイグレーションせずOK。
![スクリーンショット 2025-06-10 18.18.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726068/7546d6c3-38ff-4eb0-8139-13d0c3c1cf9e.png)



## ④：テストを実行する
```bash
# RegisterTestだけのテスト
php artisan test --filter=LoginTest
# 全体のテスト
php artisan test
```
成功の場合：
```cpp
PASS  Tests\Feature\LoginTest
✓ user can login with correct credentials
✓ user can not login with wrong password
```


# 補足
| メソッド                              | 意味                 |
| --------------------------------- | ------------------ |
| `assertRedirect('/counts')`       | ログイン成功時のリダイレクト先    |
| `assertAuthenticatedAs($user)`    | 指定のユーザーでログイン状態かどうか |
| `assertSessionHasErrors('email')` | バリデーションエラーが発生しているか |
| `assertGuest()`                   | ログインしていないことを確認     |