メインコンテンツまでスキップ

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
{
/**
* A basic test example.
*/
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);
});

一般的に、各テストはアプリケーションに対して1回のリクエストのみを行うべきです。1つのテストメソッド内で複数のリクエストが実行されると予期しない動作が発生する可能性があります。

注記

便宜上、テスト実行時には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
{
/**
* A basic functional test example.
*/
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')

レスポンスのデバッグ

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

<?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
{
/**
* A basic test example.
*/
public function test_basic_test(): void
{
$response = $this->get('/');

$response->dumpHeaders();

$response->dumpSession();

$response->dump();
}
}

または、レスポンスに関する情報をダンプして実行を停止するために ddddHeadersddSession メソッドを使用することもできます:

<?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
{
/**
* A basic test example.
*/
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');

// Assert an exception was thrown...
Exceptions::assertReported(InvalidOrderException::class);

// Assert against the exception...
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
{
/**
* A basic test example.
*/
public function test_exception_is_thrown(): void
{
Exceptions::fake();

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

// Assert an exception was thrown...
Exceptions::assertReported(InvalidOrderException::class);

// Assert against the exception...
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
);

JSON API のテスト

Laravel には、JSON API およびそのレスポンスをテストするためのいくつかのヘルパーも提供されています。たとえば、jsongetJsonpostJsonputJsonpatchJsondeleteJsonoptionsJson メソッドを使用して、さまざまな 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']);
注記

assertJson メソッドは、レスポンスを配列に変換し、与えられた配列がアプリケーションによって返された JSON レスポンス内に存在するかを検証するために PHPUnit::assertArraySubset を利用します。したがって、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メソッドを呼び出したことに気付いたかもしれません。このメソッドは、Laravelに他の属性がJSONオブジェクトに存在する可能性があることを通知します。etcメソッドが使用されていない場合、アサーションを行っていない属性がJSONオブジェクトに存在するとテストが失敗します。

この動作の意図は、etcメソッドを使用して属性に明示的にアサーションを行うか、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'])
);

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 メソッドは、クロージャを受け取ります。このクロージャは、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 クラスには、そのために whereType メソッドと whereAllType メソッドが提供されています:

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

whereType メソッドと whereAllType メソッドは、次の型を認識します: string, integer, double, boolean, array, および null

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

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

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

必要に応じて、ファイルが返すべき MIME タイプを明示的に定義するために、メソッドに $mimeType 引数を渡すこともできます:

    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

    $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 クラスは、アプリケーションをテストする際に利用できるさまざまなカスタムアサーションメソッドを提供します。これらのアサーションは、jsongetpostputdelete テストメソッドで返されるレスポンスでアクセスできます:

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

アプリケーションによって返されたレスポンスに指定された文字列が含まれていないことをアサートします。このアサーションは、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

レスポンスが禁止(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レスポンス内に指定された配列が存在するかを検証するために PHPUnit::assertArraySubset を利用します。したがって、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);

<a name="assert-content"></a>

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

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

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

assertSeeInOrder

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

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

assertSeeText

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

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

assertSeeTextInOrder

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

    $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 メソッドに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);

たとえば、アプリケーションのセッションに 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構造として返されるレスポンスや、検証エラーがセッションにフラッシュされたレスポンスに対してアサートするために使用できます:

    // Assert that no validation errors are present...
$response->assertValid();

// Assert that the given keys do not have validation errors...
$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構造として返される場合やバリデーションエラーがセッションにフラッシュされた場合に対してアサートするために使用できます:

    // Assert that no validation errors are present...
$response->assertValid();

// Assert that the given keys do not have validation errors...
$response->assertValid(['name', 'email']);

assertInvalid

指定されたキーに対してバリデーションエラーがあることをアサートします。このメソッドは、バリデーションエラーがJSON構造として返される場合やバリデーションエラーがセッションにフラッシュされた場合に対してアサートするために使用できます:

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

また、特定のキーに特定のバリデーションエラーメッセージがあることをアサートすることもできます。その際には、メッセージ全体を提供するか、メッセージの一部のみを提供することができます:

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