Skip to content

HTTPテスト

はじめに

Laravelは、アプリケーションに対してHTTPリクエストを行い、レスポンスを調査するための非常に流暢なAPIを提供します。例えば、以下に定義された機能テストを見てみましょう。

<?php

test('the application returns a successful response', function () {
    $response = $this->get('/');

    $response->assertStatus(200);
});
<?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構造などを検査するためのさまざまなアサーションが含まれています。

リクエストの作成

アプリケーションにリクエストを行うには、テスト内でgetpostputpatch、またはdeleteメソッドを呼び出すことができます。これらのメソッドは実際にはアプリケーションに対して「本物の」HTTPリクエストを発行しません。代わりに、ネットワークリクエスト全体が内部的にシミュレートされます。

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

<?php

test('basic request', function () {
    $response = $this->get('/');

    $response->assertStatus(200);
});
<?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

test('interacting with headers', function () {
    $response = $this->withHeaders([
        'X-Header' => 'Value',
    ])->post('/user', ['name' => 'Sally']);

    $response->assertStatus(201);
});
<?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

test('interacting with cookies', function () {
    $response = $this->withCookie('color', 'blue')->get('/');

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

    //
});
<?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

test('interacting with the session', function () {
    $response = $this->withSession(['banned' => false])->get('/');

    //
});
<?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

use App\Models\User;

test('an action that requires authentication', function () {
    $user = User::factory()->create();

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

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

レスポンスのデバッグ

アプリケーションに対してテストリクエストを行った後、dumpdumpHeaders、およびdumpSessionメソッドを使用してレスポンスの内容を調査およびデバッグできます。

<?php

test('basic test', function () {
    $response = $this->get('/');

    $response->dumpHeaders();

    $response->dumpSession();

    $response->dump();
});
<?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();
    }
}

あるいは、ddddHeaders、およびddSessionメソッドを使用してレスポンスに関する情報をダンプし、実行を停止することもできます。

<?php

test('basic test', function () {
    $response = $this->get('/');

    $response->ddHeaders();

    $response->ddSession();

    $response->dd();
});
<?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();
    }
}

例外処理

アプリケーションが特定の例外をスローすることをテストする必要がある場合があります。これを実現するために、Exceptionsファサードを介して例外ハンドラを「フェイク」することができます。例外ハンドラがフェイクされた後、リクエスト中にスローされた例外に対してassertReportedおよびassertNotReportedメソッドを使用してアサーションを行うことができます。

<?php

use App\Exceptions\InvalidOrderException;
use Illuminate\Support\Facades\Exceptions;

test('exception is thrown', function () {
    Exceptions::fake();

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

    // 例外がスローされたことをアサート...
    Exceptions::assertReported(InvalidOrderException::class);

    // 例外に対してアサート...
    Exceptions::assertReported(function (InvalidOrderException $e) {
        return $e->getMessage() === 'The order was invalid.';
    });
});
<?php

namespace Tests\Feature;

use App\Exceptions\InvalidOrderException;
use Illuminate\Support\Facades\Exceptions;
use Tests\TestCase;

class ExampleTest extends TestCase
{
    /**
     * 基本的なテスト例。
     */
    public function test_exception_is_thrown(): void
    {
        Exceptions::fake();

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

        // 例外がスローされたことをアサート...
        Exceptions::assertReported(InvalidOrderException::class);

        // 例外に対するアサーション...
        Exceptions::assertReported(function (InvalidOrderException $e) {
            return $e->getMessage() === 'The order was invalid.';
        });
    }
}

assertNotReported および assertNothingReported メソッドを使用して、特定の例外がリクエスト中にスローされなかったこと、または例外がスローされなかったことをアサートすることができます:

Exceptions::assertNotReported(InvalidOrderException::class);

Exceptions::assertNothingReported();

特定のリクエストに対して例外処理を完全に無効にするには、リクエストを行う前に withoutExceptionHandling メソッドを呼び出します:

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

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

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

assertThrows メソッドを使用して、指定されたクロージャ内のコードが指定されたタイプの例外をスローすることをアサートすることができます:

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

スローされた例外を検査してアサーションを行いたい場合、assertThrows メソッドの第二引数としてクロージャを提供することができます:

$this->assertThrows(
    fn () => (new ProcessOrder)->execute(),
    fn (OrderInvalid $e) => $e->orderId() === 123;
);

JSON APIのテスト

Laravelは、JSON APIとそのレスポンスをテストするためのいくつかのヘルパーも提供しています。例えば、jsongetJsonpostJsonputJsonpatchJsondeleteJson、および optionsJson メソッドを使用して、さまざまなHTTPメソッドでJSONリクエストを発行することができます。これらのメソッドにデータやヘッダーを簡単に渡すこともできます。始めるために、/api/userPOST リクエストを行い、期待されるJSONデータが返されたことをアサートするテストを書いてみましょう:

<?php

test('making an api request', function () {
    $response = $this->postJson('/api/user', ['name' => 'Sally']);

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

namespace Tests\Feature;

use Tests\TestCase;

class ExampleTest extends TestCase
{
    /**
     * A basic functional test example.
     */
    public function test_making_an_api_request(): void
    {
        $response = $this->postJson('/api/user', ['name' => 'Sally']);

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

さらに、JSONレスポンスデータはレスポンス上の配列変数としてアクセスできるため、JSONレスポンス内で返される個々の値を簡単に検査することができます:

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

Note

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

完全一致のJSONアサーション

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

<?php

test('asserting an exact json match', function () {
    $response = $this->postJson('/user', ['name' => 'Sally']);

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

namespace Tests\Feature;

use Tests\TestCase;

class ExampleTest extends TestCase
{
    /**
     * A basic functional test example.
     */
    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

test('asserting a json path value', function () {
    $response = $this->postJson('/user', ['name' => 'Sally']);

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

namespace Tests\Feature;

use Tests\TestCase;

class ExampleTest extends TestCase
{
    /**
     * A basic functional test example.
     */
    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);

流暢なJSONテスト

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

use Illuminate\Testing\Fluent\AssertableJson;

test('fluent json', function () {
    $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()
        );
});
use Illuminate\Testing\Fluent\AssertableJson;

/**
 * A basic functional test example.
 */
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 メソッドを呼び出したことに気づいたかもしれません。このメソッドは、JSONオブジェクトに他の属性が存在する可能性があることをLaravelに通知します。etc メソッドが使用されない場合、アサーションを行わなかった他の属性がJSONオブジェクトに存在すると、テストは失敗します。

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

ただし、アサーションチェーンに etc メソッドを含めないことは、JSONオブジェクト内にネストされた配列に追加の属性が追加されないことを保証するものではないことに注意してください。etc メソッドは、etc メソッドが呼び出されたネストレベルにおいて、追加の属性が存在しないことを保証するだけです。

属性の存在 / 不在のアサーション

属性の存在または不在をアサートするには、has および missing メソッドを使用できます:

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

さらに、hasAll および missingAll メソッドを使用して、複数の属性の存在または不在を同時にアサートすることができます:

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

指定されたリストの属性の少なくとも1つが存在することを確認するには、hasAny メソッドを使用できます:

$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 メソッドは、クロージャを受け取り、このクロージャは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()
             )
    );

ただし、usersコレクションに対して2つの別々のhasメソッド呼び出しを行う代わりに、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メソッドは、以下のタイプを認識します: string, integer, double, boolean, array, null

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

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

<?php

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

test('avatars can be uploaded', function () {
    Storage::fake('avatars');

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

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

    Storage::disk('avatars')->assertExists($file->hashName());
});
<?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

test('a welcome view can be rendered', function () {
    $view = $this->view('welcome', ['name' => 'Taylor']);

    $view->assertSee('Taylor');
});
<?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クラスは、以下のアサーションメソッドを提供します: assertSee, assertSeeInOrder, assertSeeText, assertSeeTextInOrder, assertDontSee, assertDontSeeText

必要に応じて、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');

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

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

$view->assertSee('Taylor');

利用可能なアサーション

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

LaravelのIlluminate\Testing\TestResponseクラスは、アプリケーションをテストする際に利用できるさまざまなカスタムアサーションメソッドを提供します。これらのアサーションは、json, get, post, put, deleteテストメソッドによって返されるレスポンスでアクセスできます。

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

assertExactJsonStructure

レスポンスが指定されたJSON構造と完全に一致することをアサートします:

$response->assertExactJsonStructure(array $data);

このメソッドは、assertJsonStructure のより厳格なバリアントです。assertJsonStructure とは対照的に、このメソッドはレスポンスに期待されたJSON構造に明示的に含まれていないキーが含まれている場合に失敗します。

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 メソッドは、レスポンスを配列に変換して、指定された配列がアプリケーションから返された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

レスポンスがメソッドが許可されていない(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

レスポンスが指定された名前付きルートにリダイレクトしていることをアサートします:

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

assertRedirectToSignedRoute

レスポンスが指定された署名付きルートにリダイレクトしていることをアサートします:

$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を渡さない限り、自動的に指定された文字列をエスケープします。レスポンス内容は、アサーションが行われる前にstrip_tags PHP関数に渡されます:

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

assertSeeTextInOrder

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

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

assertServerError

レスポンスがサーバーエラー(>= 500, < 600)HTTPステータスコードを持っていることをアサートします:

$response->assertServerError();

assertServiceUnavailable

レスポンスが「サービス利用不可」(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.'
]);

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

レスポンスがリクエスト過多(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メソッドの第2引数としてクロージャを渡すと、特定のビューデータを検査してアサーションを行うことができます:

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

さらに、ビューデータはレスポンスの配列変数としてアクセスでき、便利に検査できます:

expect($response['name'])->toBe('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',
]);

ユーザーノート