Laravelプログラミング

【Laravel+Breeze】テストでユーザー認証が必要なときの書きかた(備忘録)

Laravel9.x系。ユーザー認証が必要な場合の書き方を備忘録として。

ad

seed用意しているならそれを使う

テストやるときはFactory使う手もあるけど,ユーザー認証そのものではなく認証後の状態についてテストをしたいなら,ユーザーの情報はseedでもよい。

まず DatabaseSeeder.phpUserSeeder::class を入れてseederを呼び出すようにしておく。

class DatabaseSeeder extends Seeder
{
    public function run()
    {
        $this->call([
            UserSeeder::class,
            ・・・・
        ]);
    }
}
ad

ユーザーのseed

ユーザーのデータをseederで用意する。

$ sail artisan make:seeder UserSeeder
use App\Models\User;  <--追加

class UserSeeder extends Seeder
{
    public function run()
    {
        $user = new User();
        $user->name = "tanaka";
        $user->email = "test@gmail.com";
        //パスワードを保存する場合はbcrypt()で暗号化する。
        $user->password = bcrypt("11111111");
        $user->save();
    }
}
ad

テストの書き方

クラスの初めの部分に protected $seed = true を入れておくと,メソッドを実行するときに自動的にseedが実行されるようになる。あとはactingAs()で認証済みの状態にするとよい。seederでユーザーを一つだけ作った場合は id が 1 になっているはずなので,User::find(1) で取り出せる。

use App\Models\User;     <-- 追加

class SampleTest extends TestCase
{
    use RefreshDatabase;

    protected $seed = true;  <-- テストの前にseederが実行される

    /** @test */
    public function ダッシュボードが正しく表示される()
    {
        $response = $this->actingAs(User::find(1))  <-- id=1のユーザーとして認証
            ->get('/dashboard')
            ->assertStatus(200);
    }

    /** @test */
    public function 顧客情報のページが正しく表示される()
    {
        $response = $this->actingAs(User::find(1))  <-- あらためてseedする必要はない
            ->get('/customer')
            ->assertStatus(200);
    }
}

タイトルとURLをコピーしました