LaravelでHTTPテスト

投稿者: | 2019/05/22

いざ実装しようとしたら結構つまずいたのでわかったことをメモしておきます。

公式サイトのテストページ(Laravel5.7)

基本

以下のコマンドでFeature下やUnit下のテストをすべて網羅してくれます。

vendor\bin\phpunit

特定のテストクラスだけ実行することもできます。

vendor\bin\phpunit tests\Feature\HogeTest.php

テストメソッドとしては以下のような感じでルートを指定してあげればresponseが返ってくるのでそれをチェックすることになります。

    public function testHoge(){
        $response = $this->get('/');
        $response->assertStatus(200);
    }

ログインしてテスト

多くのウェブサービスではログインするのが当たり前なのですが割とネットで調べても詳しい情報に行きつかずトライアンドエラーしてました。
答えとしては以下のような感じで動きます。

    public function testHoge()
    {
        $user = factory(User::class, 'default')->create();
        $response = $this
        	->actingAs($user)
        	->withSession(['user_id' => $user->id])
        	->get(route('top'));
        $response->assertStatus(200);
    }

しかしこの中でわからないことがいろいろありました。

まずこれ

$user = factory(User::class, 'default')->create();

User::classは良いとして第2引数の’default’とは何か。
これはdatabase\factories下のファイルでファクトリーに定義した名前でした。
デフォルトではUserFactory.phpで以下のような形で定義されています。
名前が省略されていてこれはdefaultという名前になっています。

$factory->define(App\User::class, function (Faker $faker) {
    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'email_verified_at' => now(),
        'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret
        'remember_token' => str_random(10),
    ];
}); // ->第3引数に名前を設定できる。省略するとdefaultという名前になる。

次にこれ

        $response = $this
        	->actingAs($user)
        	->withSession(['user_id' => $user->id])
        	->get(route('top'));

ログインらしいメソッドではないですがactingAs($user)でログインぽいことができました。
しかし通常はログイン後user_idを設定していたのですが、これが設定されていませんでした。
これは自ら設定する必要があるらしくwithSession()メソッドで設定できました。

この辺がわかったので今後テストを量産していけそうです。


コメントを残す

メールアドレスが公開されることはありません。