Laravel 10.x HTTPテスト

イントロダクション

Laravelは、アプリケーションにHTTPリクエストを送信し、レスポンスを調べるためにスムーズに扱えるAPIを提供しています。例として、以下に定義している機能テストをご覧ください。

<?php

namespace Tests\Feature;

use Tests\TestCase;

class ExampleTest extends TestCase
{
    /**
     * 基本のテスト例
     */
    public function test_the_application_returns_a_successful_response(): void
    {
        $response = $this->get('/');

        $response->assertStatus(200);
    }
}

getメソッドはアプリケーションにGETリクエストを送信し、assertStatusメソッドは返えされたレスポンスに指定するHTTPステータスコードが必要であることを宣言しています。この単純なアサートに加え、Laravelはレスポンスヘッダ、コンテンツ、JSON構造などを検査するためにさまざまなアサートも用意しています。

リクエストの作成

アプリケーションにリクエストを送信するには、テスト内でgetpostputpatchdeleteメソッドを呼び出してください。これらのメソッドは、実際にはアプリケーションへ「本当の」HTTPリクエストを発行しません。代わりに、ネットワークリクエスト全体が内部でシミュレートされます。

テストリクエストメソッドは、Illuminate\Http\Responseインスタンスを返す代わりに、Illuminate\Testing\TestResponseのインスタンスを返します。これは、アプリケーションのレスポンスの検査を可能にするさまざまな有用なアサートを提供します。

<?php

namespace Tests\Feature;

use Tests\TestCase;

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

        $response->assertStatus(200);
    }
}

通常、各テストはアプリケーションに対して 1 つのリクエストしか行わないようにしてください。1つのテストメソッドの中で複数のリクエストを実行すると、 予期せぬ動作が起きる可能性があります。

Note: 利便性を良くするため、テストの実行時にCSRFミドルウェアを自動で無効にします。

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

withHeadersメソッドを使用して、アプリケーションに送信する前にリクエストのヘッダをカスタマイズできます。このメソッドを使用すると、リクエストに必要なカスタムヘッダを追加できます。

<?php

namespace Tests\Feature;

use Tests\TestCase;

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

        $response->assertStatus(201);
    }
}

クッキー

リクエストを行う前に、withCookieまたはwithCookiesメソッドを使用してクッキー値を設定できます。withCookieメソッドは2つの引数としてCookieの名前と値を引数に取りますが、withCookiesメソッドは名前/値ペアの配列を引数に取ります。

<?php

namespace Tests\Feature;

use Tests\TestCase;

class ExampleTest extends TestCase
{
    public function test_interacting_with_cookies(): void
    {
        $response = $this->withCookie('color', 'blue')->get('/');

        $response = $this->withCookies([
            'color' => 'blue',
            'name' => 'Taylor',
        ])->get('/');
    }
}

セッション/認証

Laravelは、HTTPテスト中にセッションを操作するために、ヘルパをいくつか提供しています。まず、withSessionメソッドへ配列を渡し、セッションデータを設定できます。これは、アプリケーションにリクエストを発行する前に、セッションにデータをロードする場合に役立ちます。

<?php

namespace Tests\Feature;

use Tests\TestCase;

class ExampleTest extends TestCase
{
    public function test_interacting_with_the_session(): void
    {
        $response = $this->withSession(['banned' => false])->get('/');
    }
}

Laravelのセッションは通常、現在認証しているユーザーの状態を維持するために使用します。したがって、actingAsヘルパメソッドは、指定ユーザーを現在のユーザーとして認証する簡単な方法を提供します。たとえば、モデルファクトリを使用して、ユーザーを生成および認証できます。

<?php

namespace Tests\Feature;

use App\Models\User;
use Tests\TestCase;

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

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

actingAsメソッドの2番目の引数としてガード名を渡すことにより、特定のユーザーを認証するために使用するガードを指定することもできます。actingAsメソッドに指定したガードは、テストの間、デフォルトのガードにもなります。

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

レスポンスのデバッグ

アプリケーションにテストリクエストを送ったあとは、dumpdumpHeadersdumpSessionメソッドを使用して、レスポンスの内容を調べてデバッグできます。

<?php

namespace Tests\Feature;

use Tests\TestCase;

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

        $response->dumpHeaders();

        $response->dumpSession();

        $response->dump();
    }
}

あるいは、ddddHeadersddSessionメソッドを使って、レスポンスに関する情報をダンプしてから、実行を停止することもできます。

<?php

namespace Tests\Feature;

use Tests\TestCase;

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

        $response->ddHeaders();

        $response->ddSession();

        $response->dd();
    }
}

例外処理

時には、アプリケーションが特定の例外を投げているかをテストしたい場合も起きます。例外がLaravelの例外ハンドラに捕捉され、HTTPレスポンスとして返されないようにするために、リクエストを行う前に、withoutExceptionHandlingメソッドを呼び出してください。

$response = $this->withoutExceptionHandling()->get('/');

加えて、PHP 言語やアプリケーションが使用しているライブラリで廃止された機能をアプリケーションが使用していないことを確認したい場合は、リクエストを行う前にwithoutDeprecationHandlingメソッドを呼び出してください。この廃止例外の処理を無効にすると、deprecationの警告が例外に変換され、テストが失敗するようになります。

$response = $this->withoutDeprecationHandling()->get('/');

assertThrowsメソッドを使用すると、指定クロージャ内のコードが、特定の型の例外を投げることを宣言できます。

$this->assertThrows(
    fn () => (new ProcessOrder)->execute(),
    OrderInvalid::class
);

JSON APIのテスト

Laravelは、JSON APIとそのレスポンスをテストするためのヘルパもいくつか提供しています。たとえば、jsongetJsonpostJsonputJsonpatchJsondeleteJsonoptionsJsonメソッドを使用して、さまざまなHTTP動詞でJSONリクエストを発行できます。これらのメソッドにデータとヘッダを簡単に渡すこともできます。まず、/api/userに対してPOSTリクエストを作成し、期待されるJSONデータが返されたことを宣言するテストを作成しましょう。

<?php

namespace Tests\Feature;

use Tests\TestCase;

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

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

さらに、JSONレスポンスデータは、レスポンス上の配列変数としてアクセスできるため、JSONレスポンス内で返された個々の値を調べるのに便利です。

$this->assertTrue($response['created']);

Note: assertJsonメソッドはレスポンスを配列に変換し、PHPUnit::assertArraySubsetを利用して、指定する配列がアプリケーションによって返されるJSONレスポンス内に存在することを確認しています。したがって、JSONレスポンスに他のプロパティがある場合でも、指定するフラグメントが存在する限り、このテストは合格します。

厳密なJSON一致のアサート

前述のように、assertJsonメソッドを使用して、JSONのフラグメントがJSONレスポンス内に存在することをアサートできます。指定した配列とアプリケーションが返してきたJSONが完全に一致することを確認したい場合は、assertExactJsonメソッドを使用する必要があります。

<?php

namespace Tests\Feature;

use Tests\TestCase;

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

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

JSONパスでのアサート

JSONレスポンスの指定パスに指定データが含まれていることを確認する場合は、assertJsonPathメソッドを使用する必要があります。

<?php

namespace Tests\Feature;

use Tests\TestCase;

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

        $response
            ->assertStatus(201)
            ->assertJsonPath('team.owner.name', 'Darian');
    }
}

assertJsonPathメソッドはクロージャも引数に取れます。クロージャはアサートをパスするか動的に判断するため使用されます。

$response->assertJsonPath('team.owner.name', fn (string $name) => strlen($name) >= 3);

FluentなJSONテスト

また、LaravelはアプリケーションのJSONレスポンスを流暢にテストする美しい方法を提供しています。まず始めに、assertJsonメソッドにクロージャを渡します。このクロージャは、アプリケーションが返すJSONに対してアサートを行うために使用できる、Illuminate\Testing\Fluent\AssertableJsonのインスタンスで呼び出されます。whereメソッドはJSONの特定の属性に対してアサートを行うために使用でき、missingメソッドはJSONに特定の属性がないことをアサートするために使用できます。

use Illuminate\Testing\Fluent\AssertableJson;

/**
 * 基本的な機能テストの例
 */
public function test_fluent_json(): void
{
    $response = $this->getJson('/users/1');

    $response
        ->assertJson(fn (AssertableJson $json) =>
            $json->where('id', 1)
                 ->where('name', 'Victoria Faith')
                 ->where('email', fn (string $email) => str($email)->is('victoria@gmail.com'))
                 ->whereNot('status', 'pending')
                 ->missing('password')
                 ->etc()
        );
}

etcメソッドを理解する

上記の例では、アサートのチェーンの最後でetcメソッドを呼び出したことに気づかれた方もいらっしゃるでしょう。このメソッドはLaravelへJSONオブジェクト中に他の属性が存在する可能性があることを伝えます。etcメソッドが使用されていない場合は、JSONオブジェクトに他の属性が存在していることをアサートしていないため、テストは失敗します。

この動作の意図は、属性に対して明示的にアサートを行うか、etc メソッドで追加の属性を明示的に許可することで、JSONレスポンスで意図せず機密情報を公開してしまうことを防ぐことにあります。

しかし、etcメソッドをアサートのチェーンに含めないからといっても、JSONオブジェクトのネストに含まれる配列へ、追加の属性が追加されないわけではないことを認識しておく必要はあります。etcメソッドは、etcメソッドを呼び出したネストレベルで、追加の属性が存在しないことを保証するだけです。

属性の有無をアサートする

属性が存在しているかどうかをアサートするには、hasmissingメソッドを使います。

$response->assertJson(fn (AssertableJson $json) =>
    $json->has('data')
         ->missing('message')
);

さらに、hasAllmissingAllメソッドは、複数の属性の有無を同時にアサートできます。

$response->assertJson(fn (AssertableJson $json) =>
    $json->hasAll(['status', 'data'])
         ->missingAll(['message', 'code'])
);

hasAnyメソッドを使用して、指定する属性リスト中に少なくとも1つ存在しているか判断できます。

$response->assertJson(fn (AssertableJson $json) =>
    $json->has('status')
         ->hasAny('data', 'message', 'code')
);

JSONコレクションに対するアサート

多くの場合、ルートは複数のユーザーなど、複数の項目を含むJSONレスポンスを返します。

Route::get('/users', function () {
    return User::all();
});

このような状況では、レスポンスに含まれているユーザーに対するアサートを行うために、fluentなJSONオブジェクトのhasメソッドを使用することができます。例として、JSONレスポンスに3つのユーザーが含まれていることをアサートしましょう。次に、firstメソッドを使用して、コレクション内の最初のユーザーに関するいくつかのアサートを行います。firstメソッドは、JSONコレクション内の最初のオブジェクトに関するアサートを行うために使用できる別のアサートJSON文字列を受信するクロージャを引数に取ります。

$response
    ->assertJson(fn (AssertableJson $json) =>
        $json->has(3)
             ->first(fn (AssertableJson $json) =>
                $json->where('id', 1)
                     ->where('name', 'Victoria Faith')
                     ->where('email', fn (string $email) => str($email)->is('victoria@gmail.com'))
                     ->missing('password')
                     ->etc()
             )
    );

JSONコレクションをスコープするアサーション

時々、アプリケーションのルートは名前付きキーが割り当てられているJSONコレクションを返します。

Route::get('/users', function () {
    return [
        'meta' => [...],
        'users' => User::all(),
    ];
})

これらのルートをテストするときは、コレクション内の項目数に対してhasメソッドを使えます。さらに、hasメソッドを使用してアサーションチェーンをスコープできます。

$response
    ->assertJson(fn (AssertableJson $json) =>
        $json->has('meta')
             ->has('users', 3)
             ->has('users.0', fn (AssertableJson $json) =>
                $json->where('id', 1)
                     ->where('name', 'Victoria Faith')
                     ->where('email', fn (string $email) => str($email)->is('victoria@gmail.com'))
                     ->missing('password')
                     ->etc()
             )
    );

ただし、hasコレクションにhasコレクションにアサートする2つの別々の呼び出しをするのではなく、クロージャを3番目の引数に渡す呼び出し一つにまとめられます。これで、クロージャが自動的に呼び出され、コレクション内の最初の項目にスコープされます。

$response
    ->assertJson(fn (AssertableJson $json) =>
        $json->has('meta')
             ->has('users', 3, fn (AssertableJson $json) =>
                $json->where('id', 1)
                     ->where('name', 'Victoria Faith')
                     ->where('email', fn (string $email) => str($email)->is('victoria@gmail.com'))
                     ->missing('password')
                     ->etc()
             )
    );

JSONタイプのアサート

JSONレスポンス内のプロパティが特定の型のものであることをアサートできます。Illuminate\Testing\Fluent\AssertableJsonクラスは、これを行うwhereTypewhereAllTypeメソッドを提供しています。

$response->assertJson(fn (AssertableJson $json) =>
    $json->whereType('id', 'integer')
         ->whereAllType([
            'users.0.name' => 'string',
            'meta' => 'array'
        ])
);

複数のタイプを指定するには | 文字を使用するか、タイプの配列を whereType メソッドの 2 番目のパラメータとして渡します。レスポンスの値がリストアップされたタイプのいずれかであれば、アサーションは成功します。

$response->assertJson(fn (AssertableJson $json) =>
    $json->whereType('name', 'string|null')
         ->whereType('id', ['string', 'integer'])
);

whereTypewhereAllTypeメソッドは、stringintegerdoublebooleanarraynullタイプを認識します。

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

Illuminate\Http\UploadedFileクラスは、テスト用のダミーファイルまたは画像を生成するために使用できるfakeメソッドを提供しています。これをStorageファサードのfakeメソッドと組み合わせると、ファイルアップロードのテストが大幅に簡素化されます。たとえば、次の2つの機能を組み合わせて、アバターのアップロードフォームを簡単にテストできます。

<?php

namespace Tests\Feature;

use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use Tests\TestCase;

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

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

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

        Storage::disk('avatars')->assertExists($file->hashName());
    }
}

指定ファイルが存在しないことを宣言したい場合は、Storageファサードが提供するassertMissingメソッドを使用できます。

Storage::fake('avatars');

// ...

Storage::disk('avatars')->assertMissing('missing.jpg');

fakeファイルのカスタマイズ

UploadedFileクラスが提供するfakeメソッドを使用してファイルを作成する場合、アプリケーションのバリデーションルールをより適切にテストするために、画像の幅、高さ、およびサイズ(キロバイト単位)を指定できます。

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

画像に加えて、createメソッドを使用して他のタイプのファイルも作成できます。

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

必要に応じて、メソッドに$mimeType引数を渡し、ファイルが返すMIMEタイプを明示的に定義できます。

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

ビューのテスト

Laravelを使用すると、アプリケーションに対してシミュレートするHTTPリクエストを作成せずにビューをレンダすることもできます。それには、テスト内でviewメソッドを呼び出してください。viewメソッドは、ビュー名とオプションのデータ配列を引数に取ります。このメソッドはIlluminate\Testing\TestViewのインスタンスを返します。これは、ビューのコンテンツに関するアサートを簡単に作成するためのメソッドをいくつか提供しています。

<?php

namespace Tests\Feature;

use Tests\TestCase;

class ExampleTest extends TestCase
{
    public function test_a_welcome_view_can_be_rendered(): void
    {
        $view = $this->view('welcome', ['name' => 'Taylor']);

        $view->assertSee('Taylor');
    }
}

TestViewクラスは、次のアサートメソッドを提供します。assertSeeassertSeeInOrderassertSeeTextassertSeeTextInOrderassertDontSeeassertDontSeeText

必要に応じて、TestViewインスタンスを文字列にキャストすることで、レンダリングされた素のビューコンテンツを取得できます。

$contents = (string) $this->view('welcome');

エラーの共有

一部のビューは、Laravelが提供するグローバルエラーバッグで共有されるエラーに依存する場合があります。エラーバッグをエラーメッセージでハイドレイトするには、withViewErrorsメソッドを使用できます。

$view = $this->withViewErrors([
    'name' => ['Please provide a valid name.']
])->view('form');

$view->assertSee('Please provide a valid name.');

Bladeとコンポーネントのレンダ

必要に応じて、bladeメソッドを使用して、素のBlade文字列を評価およびレンダできます。viewメソッドと同様に、bladeメソッドはIlluminate\Testing\TestViewのインスタンスを返します。

$view = $this->blade(
    '<x-component :name="$name" />',
    ['name' => 'Taylor']
);

$view->assertSee('Taylor');

componentメソッドを使用して、ブレードコンポーネントを評価およびレンダできます。componentメソッドはIlluminate\Testing\TestComponentのインスタンスを返します。

$view = $this->component(Profile::class, ['name' => 'Taylor']);

$view->assertSee('Taylor');

利用可能なアサート

レスポンスのアサート

LaravelのIlluminate\Testing\TestResponseクラスは、アプリケーションをテストするときに利用できるさまざまなカスタムアサートメソッドを提供します。これらのアサートは、jsongetpostputdeleteテストメソッドが返すレスポンスからアクセスできます。

assertBadRequest

レスポンスのHTTPステータスコードが、Bad Request(400)であることを宣言します。

$response->assertBadRequest();

assertAccepted

レスポンスのHTTPステータスコードが、accepted(202)であることを宣言します。

$response->assertAccepted();

assertConflict

レスポンスのHTTPステータスコードが、conflict(409)であることを宣言します。

$response->assertConflict();

assertCookie

レスポンスに指定するクッキーが含まれていることを宣言します。

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

assertCookieExpired

レスポンスに指定するクッキーが含まれており、有効期限が切れていることを宣言します。

$response->assertCookieExpired($cookieName);

assertCookieNotExpired

レスポンスに指定するクッキーが含まれており、有効期限が切れていないことを宣言します。

$response->assertCookieNotExpired($cookieName);

assertCookieMissing

レスポンスに指定するクッキーが含まれていないことを宣言します。

$response->assertCookieMissing($cookieName);

assertCreated

レスポンスに201 HTTPステータスコードがあることを宣言します。

$response->assertCreated();

assertDontSee

指定する文字列が、アプリケーションが返すレスポンスに含まれていないことを宣言します。このアサートは、2番目の引数にfalseを渡さない限り、指定する文字列を自動的にエスケープします。

$response->assertDontSee($value, $escaped = true);

assertDontSeeText

指定する文字列がレスポンステキストに含まれていないことを宣言します。このアサートは、2番目の引数にfalseを渡さない限り、指定する文字列を自動的にエスケープします。このメソッドは、アサートを作成する前に、レスポンスコンテンツをstrip_tags PHP関数へ渡します。

$response->assertDontSeeText($value, $escaped = true);

assertDownload

レスポンスが「ダウンロード」であることを宣言します。通常、Response::downloadレスポンス、BinaryFileResponse、またはStorage::downloadレスポンスを返すルートが起動されたことを意味します。

$response->assertDownload();

お望みであれば、ダウンロード可能なファイルに指定のファイル名が付与されていることを宣言することもできます。

$response->assertDownload('image.jpg');

assertExactJson

レスポンスに、完全一致する指定JSONデータが含まれていることを宣言します。

$response->assertExactJson(array $data);

assertForbidden

レスポンスにForbidden(403)HTTPステータスコードがあることを宣言します。

$response->assertForbidden();

assertFound

レスポンスのHTTPステータスコードが、found(302)であることを宣言します。

$response->assertFound();

assertGone

レスポンスのHTTPステータスコードが、gone(410)であることを宣言します。

$response->assertGone();

assertHeader

指定するヘッダと値がレスポンスに存在することを宣言します。

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

assertHeaderMissing

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

$response->assertHeaderMissing($headerName);

assertInternalServerError

レスポンスのHTTPステータスコードが、Internal Server Error(500)であることを宣言します。

$response->assertInternalServerError();

assertJson

レスポンスに指定するJSONデータが含まれていることを宣言します。

$response->assertJson(array $data, $strict = false);

assertJsonメソッドはレスポンスを配列に変換し、PHPUnit::assertArraySubsetを利用して、指定する配列がアプリケーションが返すJSONレスポンス内に存在しているかを確認します。したがって、JSONレスポンスに他のプロパティがある場合でも、指定するフラグメントが存在する限り、このテストは合格します。

assertJsonCount

レスポンスJSONに、指定するキーに予想されるアイテム数の配列があることを宣言します。

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

assertJsonFragment

レスポンス中のどこかに指定JSONデータが含まれていることを宣言します。

Route::get('/users', function () {
    return [
        'users' => [
            [
                'name' => 'Taylor Otwell',
            ],
        ],
    ];
});

$response->assertJsonFragment(['name' => 'Taylor Otwell']);

assertJsonIsArray

レスポンスのJSONが、配列であることを宣言します。

$response->assertJsonIsArray();

assertJsonIsObject

レスポンスのJSONが、オブジェクトであることを宣言します。

$response->assertJsonIsObject();

assertJsonMissing

レスポンスに指定するJSONデータが含まれていないことを宣言します。

$response->assertJsonMissing(array $data);

assertJsonMissingExact

レスポンスに完全一致するJSONデータが含まれていないことを宣言します。

$response->assertJsonMissingExact(array $data);

assertJsonMissingValidationErrors

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

$response->assertJsonMissingValidationErrors($keys);

Note: より一般的なassertValidメソッドを使用して、JSONで返されたレスポンスにバリデーションエラーがなく、かつセッションストレージにエラーが一時保存されていないことを宣言できます。

assertJsonPath

レスポンスに、指定するパスの指定するデータが含まれていることを宣言します。

$response->assertJsonPath($path, $expectedValue);

たとえば、アプリケーションが以下のJSONレスポンスを返す場合:

{
    "user": {
        "name": "Steve Schoger"
    }
}

userオブジェクトのnameプロパティが次のように指定する値に一致すると宣言することができます。

$response->assertJsonPath('user.name', 'Steve Schoger');

assertJsonMissingPath

レスポンスに、指定するパスが含まれないことを宣言します。

$response->assertJsonMissingPath($path);

たとえば、アプリケーションが以下のJSONレスポンスを返す場合:

{
    "user": {
        "name": "Steve Schoger"
    }
}

userオブジェクトにemailプロパティが含まれていないことを宣言できるでしょう。

$response->assertJsonMissingPath('user.email');

assertJsonStructure

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

$response->assertJsonStructure(array $structure);

たとえば、アプリケーションが返すJSONレスポンスに次のデータが含まれている場合:

{
    "user": {
        "name": "Steve Schoger"
    }
}

次のように、JSON構造がエクスペクテーションに一致すると宣言できます。

$response->assertJsonStructure([
    'user' => [
        'name',
    ]
]);

時々、アプリケーションが返すJSONレスポンスには、オブジェクトの配列が含まれている可能性があります。

{
    "user": [
        {
            "name": "Steve Schoger",
            "age": 55,
            "location": "Earth"
        },
        {
            "name": "Mary Schoger",
            "age": 60,
            "location": "Earth"
        }
    ]
}

この状況では、*文字を使って配列内のすべてのオブジェクトの構造に対して宣言できます。

$response->assertJsonStructure([
    'user' => [
        '*' => [
             'name',
             'age',
             'location'
        ]
    ]
]);

assertJsonValidationErrors

レスポンスへ、指定するキーに対する指定するJSONバリデーションエラーがあることを宣言します。このメソッドは、バリデーションエラーがセッションに一時保存されているのではなく、バリデーションエラーをJSON構造として返すレスポンスに対して宣言する場合に使用する必要があります。

$response->assertJsonValidationErrors(array $data, $responseKey = 'errors');

Note: より一般的なassertInvalidメソッドを使用して、JSONで返されたレスポンスにバリデーションエラーが存在した、もしくはエラーがセッションストレージに一時保存されたことを宣言できます。

assertJsonValidationErrorFor

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

$response->assertJsonValidationErrorFor(string $key, $responseKey = 'errors');

assertMethodNotAllowed

レスポンスのHTTPステータスコードが、method not allowed(405)であることを宣言します。

$response->assertMethodNotAllowed();

assertMovedPermanently

レスポンスのHTTPステータスコードが、moved permanently(301)であることを宣言します。

$response->assertMovedPermanently();

assertLocation

レスポンスのLocationヘッダに指定するURI値があることを宣言します。

$response->assertLocation($uri);

assertContent

指定した文字列が、レスポンスの内容と一致することを宣言します。

$response->assertContent($value);

assertNoContent

レスポンスに指定するHTTPステータスコードがあり、コンテンツがないことを宣言します。

$response->assertNoContent($status = 204);

assertStreamedContent

指定文字列がストリームしたレスポンスの内容に一致することを宣言します。

$response->assertStreamedContent($value);

assertNotFound

レスポンスにNot Found(404)HTTPステータスコードがあることを宣言します。

$response->assertNotFound();

assertOk

レスポンスに200 HTTPステータスコードがあることを宣言します。

$response->assertOk();

assertPaymentRequired

レスポンスのHTTPステータスコードが、payment required(402)であることを宣言します。

$response->assertPaymentRequired();

assertPlainCookie

レスポンスに指定する暗号化されていないクッキーが含まれていることを宣言します。

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

assertRedirect

レスポンスが指定するURIへのリダイレクトであることを宣言します。

$response->assertRedirect($uri = null);

assertRedirectContains

レスポンスが指定文字列を含むURIへリダイレクトされることを宣言します。

$response->assertRedirectContains($string);

assertRedirectToRoute

レスポンスが指定名前付きルートへリダイレクトすることを宣言します。

$response->assertRedirectToRoute($name, $parameters = []);

assertRedirectToSignedRoute

レスポンスが指定署名付きルートへリダイレクトすることを宣言します。

$response->assertRedirectToSignedRoute($name = null, $parameters = []);

assertRequestTimeout

レスポンスのHTTPステータスコードが、request timeout(408)であることを宣言します。

$response->assertRequestTimeout();

assertSee

指定する文字列がレスポンスに含まれていることを宣言します。このアサートは、2番目の引数にfalseを渡さない限り、指定する文字列を自動的にエスケープします。

$response->assertSee($value, $escaped = true);

assertSeeInOrder

指定する文字列がレスポンス内に順番に含まれていることを宣言します。このアサートは、2番目の引数へfalseを渡さない限り、指定する文字列を自動的にエスケープします。

$response->assertSeeInOrder(array $values, $escaped = true);

assertSeeText

指定する文字列がレスポンステキストに含まれていることを宣言します。このアサートは、2番目の引数にfalseを渡さない限り、指定する文字列を自動的にエスケープします。アサートが作成される前に、レスポンスの内容がstrip_tagsPHP関数に渡されます。

$response->assertSeeText($value, $escaped = true);

assertSeeTextInOrder

指定する文字列がレスポンステキスト内に順番に含まれていることを宣言します。このアサートは、2番目の引数にfalseを渡さない限り、指定する文字列を自動的にエスケープします。アサートが作成される前に、レスポンスの内容がstrip_tagsPHP関数に渡されます。

$response->assertSeeTextInOrder(array $values, $escaped = true);

assertServerError

レスポンスのHTTPステータスコードが、サーバエラー(500以上、600より小さい)であることを宣言します。

$response->assertServerError();

assertServiceUnavailable

レスポンスのHTTPステータスコードが、Service Unavailable(503)であることを宣言します。

$response->assertServiceUnavailable();

assertSessionHas

セッションに指定するデータが含まれていることを宣言します。

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

必要であれば、クロージャをassertSessionHasメソッドの第2引数へ指定できます。クロージャがtrueを返せば、アサートは成功します。

$response->assertSessionHas($key, function (User $value) {
    return $value->name === 'Taylor Otwell';
});

assertSessionHasInput

セッションの一時保存されている入力配列に指定する値があることを宣言します。

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

必要であれば、クロージャをassertSessionHasInputメソッドの第2引数へ指定できます。クロージャがtrueを返せば、アサートは成功します。

use Illuminate\Support\Facades\Crypt;

$response->assertSessionHasInput($key, function (string $value) {
    return Crypt::decryptString($value) === 'secret';
});

assertSessionHasAll

セッションにキー/値ペアの指定配列が含まれていることを宣言します。

$response->assertSessionHasAll(array $data);

たとえば、アプリケーションのセッションにnameキーとstatusキーが含まれている場合、両方が存在し、以下のような指定値を持っていると宣言できます。

$response->assertSessionHasAll([
    'name' => 'Taylor Otwell',
    'status' => 'active',
]);

assertSessionHasErrors

指定する$keysのエラーがセッションに含まれていることを宣言します。$keysが連想配列の場合、セッションに各フィールド(キー)の特定のエラーメッセージ(値)が含まれていることを宣言します。このメソッドは、バリデーションエラーをJSON構造として返すのではなく、セッションに一時保存するルートをテストするときに使用する必要があります。

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

たとえば、nameフィールドとemailフィールドにセッションへ一時保存された検証エラーメッセージがあることを宣言するには、以下のようにassertSessionHasErrorsメソッドを呼び出すことができます。

$response->assertSessionHasErrors(['name', 'email']);

または、特定のフィールドに特定のバリデーションエラーメッセージがあると宣言することもできます。

$response->assertSessionHasErrors([
    'name' => 'The given name was invalid.'
]);

Note: より一般的なassertInvalidメソッドを使用して、JSONで返されたレスポンスにバリデーションエラーが存在した、もしくはエラーがセッションストレージに一時保存されたことを宣言できます。

assertSessionHasErrorsIn

指定エラーバッグ内に指定する$keysのエラーがセッションに含まれていることを宣言します。$keysが連想配列の場合、セッションにはエラーバッグ内の各フィールド(キー)に特定のエラーメッセージ(値)が含まれていることを宣言します。

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

assertSessionHasNoErrors

セッションにバリデーションエラーがないことを宣言します。

$response->assertSessionHasNoErrors();

assertSessionDoesntHaveErrors

指定するキーのバリデーションエラーがセッションにないことを宣言します。

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

Note: より一般的なassertValidメソッドを使用して、JSONで返されたレスポンスにバリデーションエラーがなく、かつセッションストレージにエラーが一時保存されていないことを宣言できます。

assertSessionMissing

セッションに指定するキーが含まれていないことを宣言します。

$response->assertSessionMissing($key);

assertStatus

レスポンスに指定HTTPステータスコードがあることを宣言します。

$response->assertStatus($code);

assertSuccessful

レスポンスに成功した(>=200および<300)HTTPステータスコードがあることを宣言します。

$response->assertSuccessful();

assertTooManyRequests

レスポンスのHTTPステータスコードが、too many requests(429)であることを宣言します。

$response->assertTooManyRequests();

assertUnauthorized

レスポンスに不正な(401)HTTPステータスコードがあることを宣言します。

$response->assertUnauthorized();

assertUnprocessable

レスポンスに未処理のエンティティ(422)HTTPステータスコードがあることを宣言します。

$response->assertUnprocessable();

assertUnsupportedMediaType

レスポンスのHTTPステータスコードが、unsupported media type(415)であることを宣言します。

$response->assertUnsupportedMediaType();

assertValid

レスポンスに指定キーのバリデーションエラーがないことを宣言します。このメソッドは、バリデーションエラーをJSON構造として返す、もしくはバリデーションエラーをセッションへ一時保存しているレスポンスに対する宣言に使用します。

// バリデーションエラーが発生していないことを宣言
$response->assertValid();

// 指定キーのバリデーションエラーがないことを宣言
$response->assertValid(['name', 'email']);

assertInvalid

レスポンスに指定キーのバリデーションエラーがあることを宣言します。このメソッドは、バリデーションエラーをJSON構造として返す、もしくはバリデーションエラーをセッションへ一時保存しているレスポンスに対する宣言に使用します。

$response->assertInvalid(['name', 'email']);

特定のキーに特定のバリデーションエラーメッセージがあることを宣言することもできます。その場合、メッセージ全体またはメッセージのごく一部だけを指定できます。

$response->assertInvalid([
    'name' => 'The name field is required.',
    'email' => 'valid email address',
]);

assertViewHas

指定するデータの部分がレスポンスビューに含まれていることを宣言します。

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

assertViewHasメソッドの2番目の引数にクロージャを渡すと、ビューデータの特定部分に対して検査し、アサートできます。

$response->assertViewHas('user', function (User $user) {
    return $user->name === 'Taylor';
});

さらに、ビューデータはレスポンスの配列変数としてアクセスできるため、次のように簡単に検査できます。

$this->assertEquals('Taylor', $response['name']);

assertViewHasAll

レスポンスビューに指定するデータのリストがあることを宣言します。

$response->assertViewHasAll(array $data);

このメソッドは、ビューに指定するキーに一致するデータが含まれていることを宣言するために使用できます。

$response->assertViewHasAll([
    'name',
    'email',
]);

または、ビューデータが存在し、特定の値を持っていると宣言することもできます。

$response->assertViewHasAll([
    'name' => 'Taylor Otwell',
    'email' => 'taylor@example.com,',
]);

assertViewIs

指定するビューがルートによって返されたことを宣言します。

$response->assertViewIs($value);

assertViewMissing

指定するデータキーが、アプリケーションのレスポンスで返されたビューで使用可能になっていないことを宣言します。

$response->assertViewMissing($key);

認証のアサート

Laravelは、アプリケーションの機能テストで利用できるさまざまな認証関連のアサートも提供します。これらのメソッドは、getpostなどのメソッドによって返されるIlluminate\Testing\TestResponseインスタンスではなく、テストクラス自体で呼び出されることに注意してください。

assertAuthenticated

ユーザーが認証済みであることを宣言します。

$this->assertAuthenticated($guard = null);

assertGuest

ユーザーが認証されていないことを宣言します。

$this->assertGuest($guard = null);

assertAuthenticatedAs

特定のユーザーが認証済みであることを宣言します。

$this->assertAuthenticatedAs($user, $guard = null);

バリデーションのアサート

Laravelは、リクエストが提供するデータが有効か無効かを確認するために使用する、2つの主要なバリデーションに関連したアサートを提供しています。

assertValid

レスポンスに指定キーのバリデーションエラーがないことを宣言します。このメソッドは、バリデーションエラーをJSON構造として返す、もしくはバリデーションエラーをセッションへ一時保存しているレスポンスに対する宣言に使用します。

// バリデーションエラーが発生していないことを宣言
$response->assertValid();

// 指定キーのバリデーションエラーがないことを宣言
$response->assertValid(['name', 'email']);

assertInvalid

レスポンスに指定キーのバリデーションエラーがあることを宣言します。このメソッドは、バリデーションエラーをJSON構造として返す、もしくはバリデーションエラーをセッションへ一時保存しているレスポンスに対する宣言に使用します。

$response->assertInvalid(['name', 'email']);

特定のキーに特定のバリデーションエラーメッセージがあることを宣言することもできます。その場合、メッセージ全体またはメッセージのごく一部だけを指定できます。

$response->assertInvalid([
    'name' => 'The name field is required.',
    'email' => 'valid email address',
]);

ドキュメント章別ページ

ヘッダー項目移動

注目:アイコン:ページ内リンク設置(リンクがないヘッダーへの移動では、リンクがある以前のヘッダーのハッシュを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)へ移動

その他

?

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