サイトを更新しています。 数日間、レイアウトや翻訳に不具合が出ることがあります。ドキュメントは引き続きご利用いただけます。表示が崩れている場合は、後ほど再読み込みしてください。

ホーム Laravel 10.x HTTPテスト

HTTPテスト

10.x 2026年3月7日

#はじめに

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つのテストメソッド内で複数のリクエストを実行すると、予期しない動作が起こる可能性があります。

Примечание

便利なことに、テスト実行時は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つの引数を受け取り、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 メソッドを呼び出せます。非推奨処理を無効にすると、非推奨警告が例外に変換され、テストが失敗します。

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

assertThrows メソッドは、指定したクロージャ内のコードが特定の例外を投げることを検証できます。

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

#JSON APIのテスト

LaravelはJSON APIとそのレスポンスをテストするためのいくつかのヘルパーも提供します。例えば、jsongetJsonpostJsonputJsonpatchJsondeleteJsonoptionsJson メソッドを使って、さまざまなHTTP動詞でJSONリクエストを送信できます。これらのメソッドにはデータやヘッダーも簡単に渡せます。まずは、POST リクエストを /api/user に送信し、期待する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']);
Примечание

assertJson メソッドはレスポンスを配列に変換し、PHPUnit::assertArraySubset を使って指定した配列がJSONレスポンス内に存在することを検証します。つまり、JSONレスポンスに他のプロパティがあっても、指定した断片が含まれていればテストは成功します。

#JSONの完全一致を検証する

前述の通り、assertJson メソッドは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 メソッドにクロージャを渡します。このクロージャは Illuminate\Testing\Fluent\AssertableJson のインスタンスを受け取り、返されたJSONに対してアサーションを行えます。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('[email protected]'))
                 ->whereNot('status', 'pending')
                 ->missing('password')
                 ->etc()
        );
}

#etc メソッドの理解

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

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

ただし、アサーションチェーンに 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();
});

このような場合、フルーエントな JSON オブジェクトの has メソッドを使ってレスポンスに含まれるユーザーに対してアサーションできます。例えば、JSONレスポンスに3人のユーザーが含まれていることをアサートし、次にコレクションの最初のユーザーに対して first メソッドでアサーションを行います。first メソッドはクロージャを受け取り、その中で最初のオブジェクトに対するアサーションができます:

$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('[email protected]'))
                     ->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('[email protected]'))
                     ->missing('password')
                     ->etc()
             )
    );

ただし、users コレクションに対して2回 has メソッドを呼ぶ代わりに、3番目の引数にクロージャを渡す1回の呼び出しで済ませることもできます。この場合、クロージャは自動的に呼び出され、コレクションの最初のアイテムにスコープされます:

$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('[email protected]'))
                     ->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 メソッドを組み合わせることで、ファイルアップロードのテストが大幅に簡単になります。例えば、アバターアップロードフォームのテストを簡単に行えます:

<?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');

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

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' => ['有効な名前を入力してください。']
])->view('form');

$view->assertSee('有効な名前を入力してください。');

#Blade とコンポーネントのレンダリング

必要に応じて、blade メソッドを使って生の Blade 文字列を評価・レンダリングできます。view メソッドと同様に、blade メソッドは Illuminate\Testing\TestView のインスタンスを返します:

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

$view->assertSee('Taylor');

component メソッドを使うと、Blade コンポーネントを評価・レンダリングできます。component メソッドは Illuminate\Testing\TestComponent のインスタンスを返します:

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

$view->assertSee('Taylor');

#利用可能なアサーション

#レスポンスのアサーション

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

<style> .collection-method-list > p { columns: 14.4em 2; -moz-columns: 14.4em 2; -webkit-columns: 14.4em 2; } .collection-method-list a { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } </style>

#assertBadRequest

レスポンスが不正なリクエスト(400)HTTPステータスコードであることをアサートします:

$response->assertBadRequest();

#assertAccepted

レスポンスが受理済み(202)HTTPステータスコードであることをアサートします:

$response->assertAccepted();

#assertConflict

レスポンスが競合(409)HTTPステータスコードであることをアサートします:

$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

レスポンスに指定した文字列が含まれていないことをアサートします。このアサーションは、第二引数にfalseを渡さない限り自動的に文字列をエスケープします:

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

#assertDontSeeText

レスポンスのテキストに指定した文字列が含まれていないことをアサートします。このアサーションは、第二引数に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

レスポンスが禁止(403)HTTPステータスコードであることをアサートします:

$response->assertForbidden();

#assertFound

レスポンスが見つかった(302)HTTPステータスコードであることをアサートします:

$response->assertFound();

#assertGone

レスポンスが消失(410)HTTPステータスコードであることをアサートします:

$response->assertGone();

#assertHeader

レスポンスに指定したヘッダーと値が存在することをアサートします:

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

#assertHeaderMissing

レスポンスに指定したヘッダーが存在しないことをアサートします:

$response->assertHeaderMissing($headerName);

#assertInternalServerError

レスポンスが「内部サーバーエラー」(500)HTTPステータスコードであることをアサートします:

$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);
Примечание

より汎用的な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');
Примечание

より汎用的なassertInvalidメソッドは、レスポンスにJSONとして返されたバリデーションエラーがあるか、またはセッションストレージにエラーがフラッシュされていることをアサートするのに使えます。

#assertJsonValidationErrorFor

レスポンスに指定したキーのJSONバリデーションエラーが存在することをアサートします:

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

#assertMethodNotAllowed

レスポンスがメソッド不許可(405)HTTPステータスコードであることをアサートします:

$response->assertMethodNotAllowed();

#assertMovedPermanently

レスポンスが恒久的に移動(301)HTTPステータスコードであることをアサートします:

$response->assertMovedPermanently();

#assertLocation

レスポンスのLocationヘッダーに指定したURIが含まれていることをアサートします:

$response->assertLocation($uri);

#assertContent

レスポンスの内容が指定した文字列と一致することをアサートします:

$response->assertContent($value);

#assertNoContent

レスポンスが指定したHTTPステータスコードで、かつ内容が空であることをアサートします:

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

#assertStreamedContent

ストリームレスポンスの内容が指定した文字列と一致することをアサートします:

$response->assertStreamedContent($value);

#assertNotFound

レスポンスが見つからない(404)HTTPステータスコードであることをアサートします:

$response->assertNotFound();

#assertOk

レスポンスが200 HTTPステータスコードであることをアサートします:

$response->assertOk();

#assertPaymentRequired

レスポンスが支払いが必要(402)HTTPステータスコードであることをアサートします:

$response->assertPaymentRequired();

#assertPlainCookie

レスポンスに指定した暗号化されていないクッキーが含まれていることをアサートします:

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

#assertRedirect

レスポンスが指定したURIへのリダイレクトであることをアサートします:

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

#assertRedirectContains

レスポンスが指定した文字列を含むURIへリダイレクトしているかをアサートします:

$response->assertRedirectContains($string);

#assertRedirectToRoute

レスポンスが指定したnamed routeへのリダイレクトであることをアサートします:

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

#assertRedirectToSignedRoute

レスポンスが指定されたsigned routeへのリダイレクトであることをアサートします:

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

#assertRequestTimeout

レスポンスがリクエストタイムアウト(408)HTTPステータスコードであることをアサートします:

$response->assertRequestTimeout();

#assertSee

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

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

#assertSeeInOrder

レスポンスに指定した複数の文字列が順番通りに含まれていることをアサートします。このアサーションは、第二引数にfalseを渡さない限り、自動的に文字列をエスケープします:

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

#assertSeeText

レスポンスのテキストに指定した文字列が含まれていることをアサートします。このアサーションは、第二引数にfalseを渡さない限り、自動的に文字列をエスケープします。アサーションの前にレスポンスの内容はPHPのstrip_tags関数に渡されます:

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

#assertSeeTextInOrder

レスポンスのテキストに指定した複数の文字列が順番通りに含まれていることをアサートします。このアサーションは、第二引数にfalseを渡さない限り、自動的に文字列をエスケープします。アサーションの前にレスポンスの内容はPHPのstrip_tags関数に渡されます:

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

#assertServerError

レスポンスがサーバーエラー(500以上600未満)のHTTPステータスコードであることをアサートします:

$response->assertServerError();

#assertServiceUnavailable

レスポンスが「Service Unavailable」(503)のHTTPステータスコードであることをアサートします:

$response->assertServiceUnavailable();

#assertSessionHas

セッションに指定したデータが含まれていることをアサートします:

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

必要に応じて、assertSessionHasメソッドの第二引数にクロージャを渡せます。クロージャがtrueを返せばアサーションは成功します:

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

#assertSessionHasInput

セッションのフラッシュされた入力配列に指定した値が含まれていることをアサートします:

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

必要に応じて、assertSessionHasInputメソッドの第二引数にクロージャを渡せます。クロージャがtrueを返せばアサーションは成功します:

use Illuminate\Support\Facades\Crypt;

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

#assertSessionHasAll

セッションに指定したキーと値の配列がすべて含まれていることをアサートします:

$response->assertSessionHasAll(array $data);

例えば、アプリケーションのセッションにnamestatusキーがある場合、両方が存在し指定した値を持つことを次のようにアサートできます:

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

#assertSessionHasErrors

セッションに指定した$keysのエラーが含まれていることをアサートします。$keysが連想配列の場合は、各フィールド(キー)に対して特定のエラーメッセージ(値)が含まれていることをアサートします。このメソッドは、バリデーションエラーがJSONではなくセッションにフラッシュされるルートのテストに使います:

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

例えば、nameemail フィールドにセッションにフラッシュされたバリデーションエラーメッセージがあることを検証するには、次のように assertSessionHasErrors メソッドを呼び出します:

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

または、特定のフィールドに特定のバリデーションエラーメッセージがあることをアサートできます:

$response->assertSessionHasErrors([
    'name' => 'The given name was invalid.'
]);
Примечание

より汎用的なassertInvalidメソッドは、レスポンスにJSON形式のバリデーションエラーが含まれる場合や、エラーがセッションにフラッシュされている場合の両方でアサートできます。

#assertSessionHasErrorsIn

特定のエラーバッグ内に、指定した$keysのエラーが含まれていることをアサートします。$keysが連想配列の場合は、エラーバッグ内で各フィールド(キー)に対して特定のエラーメッセージ(値)が含まれていることをアサートします:

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

#assertSessionHasNoErrors

セッションにバリデーションエラーがないことをアサートします:

$response->assertSessionHasNoErrors();

#assertSessionDoesntHaveErrors

指定したキーに対してセッションにバリデーションエラーがないことをアサートします:

$response->assertSessionDoesntHaveErrors($keys = [], $format = null, $errorBag = 'default');
Примечание

より汎用的なassertValidメソッドは、レスポンスにJSON形式のバリデーションエラーが含まれず、かつエラーがセッションにフラッシュされていないことをアサートできます。

#assertSessionMissing

セッションに指定したキーが含まれていないことをアサートします:

$response->assertSessionMissing($key);

#assertStatus

レスポンスが指定したHTTPステータスコードであることをアサートします:

$response->assertStatus($code);

#assertSuccessful

レスポンスが成功(200以上300未満)のHTTPステータスコードであることをアサートします:

$response->assertSuccessful();

#assertTooManyRequests

レスポンスがリクエスト過多(429)のHTTPステータスコードであることをアサートします:

$response->assertTooManyRequests();

#assertUnauthorized

レスポンスが認証されていない(401)のHTTPステータスコードであることをアサートします:

$response->assertUnauthorized();

#assertUnprocessable

レスポンスが処理できないエンティティ(422)のHTTPステータスコードであることをアサートします:

$response->assertUnprocessable();

#assertUnsupportedMediaType

レスポンスがサポートされていないメディアタイプ(415)のHTTPステータスコードであることをアサートします:

$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メソッドの第二引数にクロージャを渡すと、特定のビューのデータを検査してアサートできます:

$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' => '[email protected],',
]);

#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',
]);