ユーザー登録テストの実装手順（Laravel 9 / PHP 8）

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



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



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

namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

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

    public function test_user_can_register()
    {
        $formData = [
            'name' => 'テスト太郎',
            'email' => 'test@example.com',
            'password' => 'password',
            'password_confirmation' => 'password',
        ];

        // 登録リクエストを送信
        $response = $this->post('/register', $formData); // /register に POSTリクエストを送る

        // /counts にリダイレクトされることを確認
        $response->assertRedirect('/counts');

        // users テーブルにデータが存在するか確認
        $this->assertDatabaseHas('users', [
            'email' => 'test@example.com',
        ]);
    }
}
```



## ③：CustomResetPassword を使用している場合、 /tests/Feature/RegisterTest.php を修正する
私はメール本文を全て日本語にしたいので、ResetPassword を Custom する CustomResetPassword を作成している。

そのため、
/tests/Feature/Auth/PasswordResetTest.php
のデフォルト(ResetPassword)を CustomResetPassword に修正しないと、エラーになってしまう。

```/tests/Feature/Auth/PasswordResetTest.php
<?php

namespace Tests\Feature\Auth;

// 修正前
// use Illuminate\Auth\Notifications\ResetPassword;
// 修正後
use App\Notifications\CustomResetPassword;

class PasswordResetTest extends TestCase
{

    public function test_reset_password_link_can_be_requested(): void
    {
        // 修正前
        // Notification::assertSentTo($user, ResetPassword::class);
        // 修正後
        Notification::assertSentTo($user, CustomResetPassword::class);
    }

    public function test_reset_password_screen_can_be_rendered(): void
    {
        // 修正前
        // Notification::assertSentTo($user, ResetPassword::class, function ($notification) {
        // 修正後
        Notification::assertSentTo($user, CustomResetPassword::class, function ($notification) {
            
        });
    }

    public function test_password_can_be_reset_with_valid_token(): void
    {

        // 修正前
        // Notification::assertSentTo($user, ResetPassword::class, function ($notification) use ($user) {
        // 修正後
        Notification::assertSentTo($user, CustomResetPassword::class, function ($notification) use ($user) {

        });
    }
}
```


### 関連：CustomResetPassword 作成方法

https://qiita.com/honaki/items/2906571f60a95c5b4f37#---2%E9%80%9A%E7%9F%A5%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%92%E7%B7%A8%E9%9B%86customresetpasswordphp



## ④：テスト用の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 16.33.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726068/e18af966-0ccd-4efb-a5bf-078b49c41922.png)



## ⑤：テストを実行する
```bash
# RegisterTestだけのテスト
php artisan test --filter=RegisterTest
# 全体のテスト
php artisan test
```
成功の場合：
```cpp
PASS  Tests\Feature\RegisterTest
✓ user can register
```