Laravel 5.8 HTTPテスト

イントロダクション

Laravelはアプリケーションに対するHTTPリクエストを作成し、出力を検査するためのとても記述的なAPIを用意しています。例として、以下のテストをご覧ください。

<?php

namespace Tests\Feature;

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

class ExampleTest extends TestCase
{
    /**
     * 基本的な機能テストの例
     *
     * @return void
     */
    public function testBasicTest()
    {
        $response = $this->get('/');

        $response->assertStatus(200);
    }
}

getメソッドはアプリケーションに対して、GETリクエストを作成します。assertStatusメソッドは返されたレスポンスが指定したHTTPステータスコードを持っていることをアサートします。このシンプルな例に加え、レスポンスヘッダ、コンテンツ、JSON構造などを検査する様々なアサートをLaravelは用意しています。

リクエストヘッダのカスタマイズ

アプリーケーションへ送り返す前に、リクエストヘッダをカスタマイズするには、withHeadersメソッドを使います。これにより任意のカスタムヘッダをリクエストに追加することができます。

<?php

class ExampleTest extends TestCase
{
    /**
     * 基本的な機能テストの例
     *
     * @return void
     */
    public function testBasicExample()
    {
        $response = $this->withHeaders([
            'X-Header' => 'Value',
        ])->json('POST', '/user', ['name' => 'Sally']);

        $response
            ->assertStatus(201)
            ->assertJson([
                'created' => true,
            ]);
    }
}

Tip!! テスト実行時、CSRFミドルウェアは自動的に無効になります。

レスポンスのデバッグ

アプリケーションへ送るテストリクエストを作成し終えたら、レスポンスの内容を確認し、デバッグするためにdumpdumpHeadersメソッドが使用できます。

<?php

namespace Tests\Feature;

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

class ExampleTest extends TestCase
{
    /**
     * 基本的なテスト例
     *
     * @return void
     */
    public function testBasicTest()
    {
        $response = $this->get('/');

        $response->dumpHeaders();

        $response->dump();
    }
}

セッション/認証

Laravelはテスト時にセッションを操作するたくさんのヘルパも提供しています。1つ目は指定した配列をセッションに保存するwithSessionメソッドです。これはアプリケーションのリクエストをテストする前に、データをセッションにロードしたい場合に便利です。

<?php

class ExampleTest extends TestCase
{
    public function testApplication()
    {
        $response = $this->withSession(['foo' => 'bar'])
                         ->get('/');
    }
}

認証済みのユーザーのようなユーザー状態をセッションへ保持するのは一般的です。actingAsヘルパメソッドは現在認証済みのユーザーを指定する簡単な手段を提供します。例として、モデルファクトリでユーザーを生成し、認証してみましょう。

<?php

use App\User;

class ExampleTest extends TestCase
{
    public function testApplication()
    {
        $user = factory(User::class)->create();

        $response = $this->actingAs($user)
                         ->withSession(['foo' => 'bar'])
                         ->get('/');
    }
}

ユーザーの認証にどのガードを使用するかを指定したい場合、actingAsメソッドの第2引数にガード名を渡します。

$this->actingAs($user, 'api')

JSON APIのテスト

LaravelはJSON APIとレスポンスをテストする数多くのヘルパを用意しています。たとえば、jsongetpostputpatchdeleteoptionメソッドはそれぞれのHTTP動詞のリクエストを発生させるために使用します。これらのメソッドには簡単にデータやヘッダを渡せます。手始めに、/userに対するPOSTリクエストを作成し、期待したデータが返されることをアサートするテストを書いてみましょう。

<?php

class ExampleTest extends TestCase
{
    /**
     * 基本的な機能テストの例
     *
     * @return void
     */
    public function testBasicExample()
    {
        $response = $this->json('POST', '/user', ['name' => 'Sally']);

        $response
            ->assertStatus(201)
            ->assertJson([
                'created' => true,
            ]);
    }
}

Tip!! The assertJsonメソッドはレスポンスを配列へ変換し、PHPUnit::assertArraySubsetを使用しアプリケーションへ戻ってきたJSONレスポンスの中に、指定された配列が含まれているかを確認します。そのため、JSONレスポンスの中に他のプロパティが存在していても、このテストは指定した一部が残っている限り、テストはパスし続けます。

JSONとの完全一致を検証

アプリケーションから返されるJSONが、指定した配列と完全に一致することを検証したい場合は、assertExactJsonメソッドを使用します。

<?php

class ExampleTest extends TestCase
{
    /**
     * 基本的な機能テストの例
     *
     * @return void
     */
    public function testBasicExample()
    {
        $response = $this->json('POST', '/user', ['name' => 'Sally']);

        $response
            ->assertStatus(201)
            ->assertExactJson([
                'created' => true,
            ]);
    }
}

ファイルアップロードのテスト

Illuminate\Http\UploadedFileクラスは、テストのためにファイルやイメージのダミーを生成するためのfakeメソッドを用意しています。これをStorageファサードのfakeメソッドと組み合わせることで、ファイルアップロードのテストがとてもシンプルになります。例として、2つの機能を組み合わせて、アバターのアップロードをテストしてみましょう。

<?php

namespace Tests\Feature;

use Tests\TestCase;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;

class ExampleTest extends TestCase
{
    public function testAvatarUpload()
    {
        Storage::fake('avatars');

        $file = UploadedFile::fake()->image('avatar.jpg');

        $response = $this->json('POST', '/avatar', [
            'avatar' => $file,
        ]);

        // ファイルが保存されたことをアサートする
        Storage::disk('avatars')->assertExists($file->hashName());

        // ファイルが存在しないことをアサートする
        Storage::disk('avatars')->assertMissing('missing.jpg');
    }
}

ダミーファイルのカスタマイズ

fakeメソッドでファイルを生成するときには、バリデーションルールをより便利にテストできるように、画像の幅、高さ、サイズを指定できます。

UploadedFile::fake()->image('avatar.jpg', $width, $height)->size(100);

画像の生成に付け加え、createメソッドで他のタイプのファイルも生成できます。

UploadedFile::fake()->create('document.pdf', $sizeInKilobytes);

利用可能なアサート

レスポンスのアサート

PHPUnitテスト用に、数多くの追加アサートメソッドをLaravelは提供しています。以下のアサートで、jsongetpostputdeleteテストメソッドから返されたレスポンスへアクセスしてください。

assertCookie

レスポンスが指定したクッキーを持っていることを宣言。

$response->assertCookie($cookieName, $value = null);

assertCookieExpired

レスポンスが指定したクッキーを持っており、期限切れであることを宣言。

$response->assertCookieExpired($cookieName);

assertCookieNotExpired

レスポンスが指定したクッキーを持っており、期限切れでないことを宣言。

$response->assertCookieNotExpired($cookieName);

assertCookieMissing

レスポンスが指定したクッキーを持っていないことを宣言。

$response->assertCookieMissing($cookieName);

assertDontSee

指定した文字列がレスポンスに含まれていないことを宣言。

$response->assertDontSee($value);

assertDontSeeText

指定した文字列がレスポンステキストに含まれていないことを宣言。

$response->assertDontSeeText($value);

assertExactJson

レスポンスが指定したJSONデータと完全に一致するデータを持っていることを宣言。

$response->assertExactJson(array $data);

assertForbidden

レスポンスがforbiddenステータスコードを持っていることを宣言。

$response->assertForbidden();

assertHeader

レスポンスに指定したヘッダが存在していることを宣言。

$response->assertHeader($headerName, $value = null);

assertHeaderMissing

レスポンスに指定したヘッダが存在していないことを宣言。

$response->assertHeaderMissing($headerName);

assertJson

レスポンスが指定したJSONデータを持っていることを宣言。

$response->assertJson(array $data);

assertJsonCount

レスポンスJSONが、指定したキーのアイテムを、期待値分持っていることを宣言。

$response->assertJsonCount($count, $key = null);

assertJsonFragment

レスポンスが指定したJSONの一部を含んでいることを宣言。

$response->assertJsonFragment(array $data);

assertJsonMissing

レスポンスが指定したJSONの一部を含んでいないことを宣言。

$response->assertJsonMissing(array $data);

assertJsonMissingExact

レスポンスがJSONの一部をそのまま含んでいないことを宣言。

$response->assertJsonMissingExact(array $data);

assertJsonMissingValidationErrors

レスポンスが指定したキーに対するJSONバリデーションエラーを含んていないことを宣言。

$response->assertJsonMissingValidationErrors($keys);

assertJsonStructure

レスポンスが指定したJSONの構造を持っていることを宣言。

$response->assertJsonStructure(array $structure);

assertJsonValidationErrors

レスポンスが指定したJSONバリデーションエラーを持っていることを宣言。

$response->assertJsonValidationErrors(array $data);

assertLocation

レスポンスのLocationヘッダが、指定したURIを持つことを宣言。

$response->assertLocation($uri);

assertNotFound

レスポンスがnot foundのステータスコードを持っていることを宣言。

$response->assertNotFound();

assertOk

レスポンスが200のステータスコードを持っていることを宣言。

$response->assertOk();

assertPlainCookie

レスポンスが指定した暗号化されていないクッキーを持っていることを宣言。

$response->assertPlainCookie($cookieName, $value = null);

assertRedirect

クライアントが指定したURIへリダイレクトすることを宣言。

$response->assertRedirect($uri);

assertSee

指定した文字列がレスポンスに含まれていることを宣言。

$response->assertSee($value);

assertSeeInOrder

指定した文字列が、順番通りにレスポンスに含まれていることを宣言。

$response->assertSeeInOrder(array $values);

assertSeeText

指定した文字列がレスポンステキストに含まれていることを宣言。

$response->assertSeeText($value);

assertSeeTextInOrder

指定した文字列が、順番通りにレンスポンステキストへ含まれていることを宣言。

$response->assertSeeTextInOrder(array $values);

assertSessionHas

セッションが指定したデータを持っていることを宣言。

$response->assertSessionHas($key, $value = null);

assertSessionHasInput

そのセッションが指定値をフラッシュデータの入力配列中に持っていることを宣言。

$response->assertSessionHasInput($key, $value = null);

assertSessionHasAll

セッションが指定したリストの値を持っていることを宣言。

$response->assertSessionHasAll(array $data);

assertSessionHasErrors

セッションが指定したフィールドに対するエラーを含んでいることを宣言。

$response->assertSessionHasErrors(array $keys, $format = null, $errorBag = 'default');

assertSessionHasErrorsIn

セッションが指定したエラーを持っていることを宣言。

$response->assertSessionHasErrorsIn($errorBag, $keys = [], $format = null);

assertSessionHasNoErrors

セッションがエラーを持っていないことを宣言。

$response->assertSessionHasNoErrors();

assertSessionDoesntHaveErrors

セッションが、指定したキーに対するエラーを持っていないことを宣言。

$response->assertSessionDoesntHaveErrors($keys = [], $format = null, $errorBag = 'default');

assertSessionMissing

セッションが指定したキーを持っていないことを宣言。

$response->assertSessionMissing($key);

assertStatus

クライアントのレスポンスが指定したコードであることを宣言。

$response->assertStatus($code);

assertSuccessful

レスポンスが成功(200)ステータスコードであることを宣言。

$response->assertSuccessful();

assertUnauthorized

レスポンスがオーソライズされていない(401)ステータスコードであることを宣言。

$response->assertUnauthorized();

assertViewHas

レスポンスビューが指定したデータを持っていることを宣言。

$response->assertViewHas($key, $value = null);

assertViewHasAll

レスポンスビューが指定したリストのデータを持っていることを宣言。

$response->assertViewHasAll(array $data);

assertViewIs

ルートにより、指定したビューが返されたことを宣言。

$response->assertViewIs($value);

assertViewMissing

レスポンスビューが指定したデータを持っていないことを宣言。

$response->assertViewMissing($key);

認証のアサート

Laravelは、PHPUnitテストのために認証関連の様々なアサーションも提供しています。

メソッド 説明
$this->assertAuthenticated($guard = null); ユーザーが認証されていることを宣言。
$this->assertGuest($guard = null); ユーザーが認証されていないことを宣言。
$this->assertAuthenticatedAs($user, $guard = null); 指定したユーザーが認証されていることを宣言。
$this->assertCredentials(array $credentials, $guard = null); 指定した認証情報が有効であることを宣言。
$this->assertInvalidCredentials(array $credentials, $guard = null); 指定した認証情報が無効であることを宣言。

ドキュメント章別ページ

ヘッダー項目移動

注目:アイコン:ページ内リンク設置(リンクがないヘッダーへの移動では、リンクがある以前のヘッダーのハッシュをURLへ付加します。

移動

クリックで即時移動します。

設定

適用ボタンクリック後に、全項目まとめて適用されます。

カラーテーマ
和文指定 Pagination
和文指定 Scaffold
Largeスクリーン表示幅
インデント
本文フォント
コードフォント
フォント適用確認

フォントの指定フィールドから、フォーカスが外れると、当ブロックの内容に反映されます。EnglishのDisplayもPreviewしてください。

フォント設定時、表示に不具合が出た場合、当サイトのクッキーを削除してください。

バックスラッシュを含むインライン\Code\Blockの例です。

以下はコードブロックの例です。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * ユーザに関連する電話レコードを取得
     */
    public function phone()
    {
        return $this->hasOne('App\Phone');
    }
}

設定を保存する前に、表示が乱れないか必ず確認してください。CSSによるフォントファミリー指定の知識がない場合は、フォントを変更しないほうが良いでしょう。

キーボード・ショートカット

オープン操作

PDC

ページ(章)移動の左オフキャンバスオープン

HA

ヘッダー移動モーダルオープン

MS

移動/設定の右オフキャンバスオープン

ヘッダー移動

T

最初のヘッダーへ移動

E

最後のヘッダーへ移動

NJ

次ヘッダー(H2〜H4)へ移動

BK

前ヘッダー(H2〜H4)へ移動

その他

?

このヘルプページ表示
閉じる