コンテンツへスキップ

HTTPテスト

イントロダクション

Laravelは、アプリケーションへのHTTPリクエストを行い、レスポンスを検証するための非常に流暢なAPIを提供しています。たとえば、以下で定義されている機能テストをご覧ください。

1<?php
2 
3test('the application returns a successful response', function () {
4 $response = $this->get('/');
5 
6 $response->assertStatus(200);
7});
1<?php
2 
3namespace Tests\Feature;
4 
5use Tests\TestCase;
6 
7class ExampleTest extends TestCase
8{
9 /**
10 * A basic test example.
11 */
12 public function test_the_application_returns_a_successful_response(): void
13 {
14 $response = $this->get('/');
15 
16 $response->assertStatus(200);
17 }
18}

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

リクエストの実行

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

Illuminate\Http\Responseインスタンスを返す代わりに、テストリクエストメソッドはIlluminate\Testing\TestResponseのインスタンスを返します。これには、アプリケーションのレスポンスを検査できる便利なアサーションが様々用意されています。

1<?php
2 
3test('basic request', function () {
4 $response = $this->get('/');
5 
6 $response->assertStatus(200);
7});
1<?php
2 
3namespace Tests\Feature;
4 
5use Tests\TestCase;
6 
7class ExampleTest extends TestCase
8{
9 /**
10 * A basic test example.
11 */
12 public function test_a_basic_request(): void
13 {
14 $response = $this->get('/');
15 
16 $response->assertStatus(200);
17 }
18}

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

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

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

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

1<?php
2 
3test('interacting with headers', function () {
4 $response = $this->withHeaders([
5 'X-Header' => 'Value',
6 ])->post('/user', ['name' => 'Sally']);
7 
8 $response->assertStatus(201);
9});
1<?php
2 
3namespace Tests\Feature;
4 
5use Tests\TestCase;
6 
7class ExampleTest extends TestCase
8{
9 /**
10 * A basic functional test example.
11 */
12 public function test_interacting_with_headers(): void
13 {
14 $response = $this->withHeaders([
15 'X-Header' => 'Value',
16 ])->post('/user', ['name' => 'Sally']);
17 
18 $response->assertStatus(201);
19 }
20}

クッキー

リクエストを行う前にクッキーの値を設定するには、withCookieまたはwithCookiesメソッドを使用します。withCookieメソッドはクッキーの名前と値を2つの引数として受け入れ、withCookiesメソッドは名前と値のペアの配列を受け入れます。

1<?php
2 
3test('interacting with cookies', function () {
4 $response = $this->withCookie('color', 'blue')->get('/');
5 
6 $response = $this->withCookies([
7 'color' => 'blue',
8 'name' => 'Taylor',
9 ])->get('/');
10 
11 //
12});
1<?php
2 
3namespace Tests\Feature;
4 
5use Tests\TestCase;
6 
7class ExampleTest extends TestCase
8{
9 public function test_interacting_with_cookies(): void
10 {
11 $response = $this->withCookie('color', 'blue')->get('/');
12 
13 $response = $this->withCookies([
14 'color' => 'blue',
15 'name' => 'Taylor',
16 ])->get('/');
17 
18 //
19 }
20}

セッション/認証

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

1<?php
2 
3test('interacting with the session', function () {
4 $response = $this->withSession(['banned' => false])->get('/');
5 
6 //
7});
1<?php
2 
3namespace Tests\Feature;
4 
5use Tests\TestCase;
6 
7class ExampleTest extends TestCase
8{
9 public function test_interacting_with_the_session(): void
10 {
11 $response = $this->withSession(['banned' => false])->get('/');
12 
13 //
14 }
15}

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

1<?php
2 
3use App\Models\User;
4 
5test('an action that requires authentication', function () {
6 $user = User::factory()->create();
7 
8 $response = $this->actingAs($user)
9 ->withSession(['banned' => false])
10 ->get('/');
11 
12 //
13});
1<?php
2 
3namespace Tests\Feature;
4 
5use App\Models\User;
6use Tests\TestCase;
7 
8class ExampleTest extends TestCase
9{
10 public function test_an_action_that_requires_authentication(): void
11 {
12 $user = User::factory()->create();
13 
14 $response = $this->actingAs($user)
15 ->withSession(['banned' => false])
16 ->get('/');
17 
18 //
19 }
20}

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

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

レスポンスのデバッグ

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

1<?php
2 
3test('basic test', function () {
4 $response = $this->get('/');
5 
6 $response->dumpHeaders();
7 
8 $response->dumpSession();
9 
10 $response->dump();
11});
1<?php
2 
3namespace Tests\Feature;
4 
5use Tests\TestCase;
6 
7class ExampleTest extends TestCase
8{
9 /**
10 * A basic test example.
11 */
12 public function test_basic_test(): void
13 {
14 $response = $this->get('/');
15 
16 $response->dumpHeaders();
17 
18 $response->dumpSession();
19 
20 $response->dump();
21 }
22}

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

1<?php
2 
3test('basic test', function () {
4 $response = $this->get('/');
5 
6 $response->ddHeaders();
7 $response->ddSession();
8 $response->ddJson();
9 $response->dd();
10});
1<?php
2 
3namespace Tests\Feature;
4 
5use Tests\TestCase;
6 
7class ExampleTest extends TestCase
8{
9 /**
10 * A basic test example.
11 */
12 public function test_basic_test(): void
13 {
14 $response = $this->get('/');
15 
16 $response->ddHeaders();
17 
18 $response->ddSession();
19 
20 $response->dd();
21 }
22}

例外処理

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

1<?php
2 
3use App\Exceptions\InvalidOrderException;
4use Illuminate\Support\Facades\Exceptions;
5 
6test('exception is thrown', function () {
7 Exceptions::fake();
8 
9 $response = $this->get('/order/1');
10 
11 // Assert an exception was thrown...
12 Exceptions::assertReported(InvalidOrderException::class);
13 
14 // Assert against the exception...
15 Exceptions::assertReported(function (InvalidOrderException $e) {
16 return $e->getMessage() === 'The order was invalid.';
17 });
18});
1<?php
2 
3namespace Tests\Feature;
4 
5use App\Exceptions\InvalidOrderException;
6use Illuminate\Support\Facades\Exceptions;
7use Tests\TestCase;
8 
9class ExampleTest extends TestCase
10{
11 /**
12 * A basic test example.
13 */
14 public function test_exception_is_thrown(): void
15 {
16 Exceptions::fake();
17 
18 $response = $this->get('/');
19 
20 // Assert an exception was thrown...
21 Exceptions::assertReported(InvalidOrderException::class);
22 
23 // Assert against the exception...
24 Exceptions::assertReported(function (InvalidOrderException $e) {
25 return $e->getMessage() === 'The order was invalid.';
26 });
27 }
28}

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

1Exceptions::assertNotReported(InvalidOrderException::class);
2 
3Exceptions::assertNothingReported();

リクエストを行う前にwithoutExceptionHandlingメソッドを呼び出すことで、特定のリクエストの例外処理を完全に無効にできます。

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

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

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

assertThrowsメソッドを使用して、指定のクロージャ内のコードが指定の型の例外をスローすることをアサートできます。

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

スローされた例外を検査し、それに対してアサーションを行いたい場合は、assertThrowsメソッドの2番目の引数としてクロージャを提供できます。

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

JSON APIのテスト

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

1<?php
2 
3test('making an api request', function () {
4 $response = $this->postJson('/api/user', ['name' => 'Sally']);
5 
6 $response
7 ->assertStatus(201)
8 ->assertJson([
9 'created' => true,
10 ]);
11});
1<?php
2 
3namespace Tests\Feature;
4 
5use Tests\TestCase;
6 
7class ExampleTest extends TestCase
8{
9 /**
10 * A basic functional test example.
11 */
12 public function test_making_an_api_request(): void
13 {
14 $response = $this->postJson('/api/user', ['name' => 'Sally']);
15 
16 $response
17 ->assertStatus(201)
18 ->assertJson([
19 'created' => true,
20 ]);
21 }
22}

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

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

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

JSONの完全一致をアサートする

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

1<?php
2 
3test('asserting an exact json match', function () {
4 $response = $this->postJson('/user', ['name' => 'Sally']);
5 
6 $response
7 ->assertStatus(201)
8 ->assertExactJson([
9 'created' => true,
10 ]);
11});
1<?php
2 
3namespace Tests\Feature;
4 
5use Tests\TestCase;
6 
7class ExampleTest extends TestCase
8{
9 /**
10 * A basic functional test example.
11 */
12 public function test_asserting_an_exact_json_match(): void
13 {
14 $response = $this->postJson('/user', ['name' => 'Sally']);
15 
16 $response
17 ->assertStatus(201)
18 ->assertExactJson([
19 'created' => true,
20 ]);
21 }
22}

JSONパスに対するアサート

JSONレスポンスが指定されたパスに指定のデータを含んでいることを検証したい場合は、assertJsonPathメソッドを使用する必要があります。

1<?php
2 
3test('asserting a json path value', function () {
4 $response = $this->postJson('/user', ['name' => 'Sally']);
5 
6 $response
7 ->assertStatus(201)
8 ->assertJsonPath('team.owner.name', 'Darian');
9});
1<?php
2 
3namespace Tests\Feature;
4 
5use Tests\TestCase;
6 
7class ExampleTest extends TestCase
8{
9 /**
10 * A basic functional test example.
11 */
12 public function test_asserting_a_json_paths_value(): void
13 {
14 $response = $this->postJson('/user', ['name' => 'Sally']);
15 
16 $response
17 ->assertStatus(201)
18 ->assertJsonPath('team.owner.name', 'Darian');
19 }
20}

assertJsonPathメソッドはクロージャも受け入れ、これを使用してアサーションが成功するかどうかを動的に決定できます。

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

流暢なJSONテスト

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

1use Illuminate\Testing\Fluent\AssertableJson;
2 
3test('fluent json', function () {
4 $response = $this->getJson('/users/1');
5 
6 $response
7 ->assertJson(fn (AssertableJson $json) =>
8 $json->where('id', 1)
9 ->where('name', 'Victoria Faith')
10 ->where('email', fn (string $email) => str($email)->is('[email protected]'))
11 ->whereNot('status', 'pending')
12 ->missing('password')
13 ->etc()
14 );
15});
1use Illuminate\Testing\Fluent\AssertableJson;
2 
3/**
4 * A basic functional test example.
5 */
6public function test_fluent_json(): void
7{
8 $response = $this->getJson('/users/1');
9 
10 $response
11 ->assertJson(fn (AssertableJson $json) =>
12 $json->where('id', 1)
13 ->where('name', 'Victoria Faith')
14 ->where('email', fn (string $email) => str($email)->is('[email protected]'))
15 ->whereNot('status', 'pending')
16 ->missing('password')
17 ->etc()
18 );
19}

etcメソッドを理解する

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

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

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

属性の存在・不在をアサートする

属性が存在するかしないかをアサートするには、hasおよびmissingメソッドを使用できます。

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

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

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

hasAnyメソッドを使用して、指定された属性リストのうち少なくとも1つが存在するかどうかを判断できます。

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

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

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

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

このような状況では、流暢なJSONオブジェクトのhasメソッドを使用して、レスポンスに含まれるユーザーに対してアサーションを行うことができます。たとえば、JSONレスポンスに3人のユーザーが含まれていることをアサートしてみましょう。次に、firstメソッドを使用して、コレクションの最初のユーザーについていくつかのアサーションを行います。firstメソッドは、JSONコレクションの最初のオブジェクトについてアサーションを行うために使用できる別のアサート可能なJSON文字列を受け取るクロージャを受け入れます。

1$response
2 ->assertJson(fn (AssertableJson $json) =>
3 $json->has(3)
4 ->first(fn (AssertableJson $json) =>
5 $json->where('id', 1)
6 ->where('name', 'Victoria Faith')
7 ->where('email', fn (string $email) => str($email)->is('[email protected]'))
8 ->missing('password')
9 ->etc()
10 )
11 );

JSONコレクションアサーションのスコープ設定

アプリケーションのルートが、名前付きキーが割り当てられたJSONコレクションを返すことがあります。

1Route::get('/users', function () {
2 return [
3 'meta' => [...],
4 'users' => User::all(),
5 ];
6})

これらのルートをテストする場合、hasメソッドを使用してコレクション内のアイテムの数をアサートできます。さらに、hasメソッドを使用してアサーションのチェーンをスコープ設定できます。

1$response
2 ->assertJson(fn (AssertableJson $json) =>
3 $json->has('meta')
4 ->has('users', 3)
5 ->has('users.0', fn (AssertableJson $json) =>
6 $json->where('id', 1)
7 ->where('name', 'Victoria Faith')
8 ->where('email', fn (string $email) => str($email)->is('[email protected]'))
9 ->missing('password')
10 ->etc()
11 )
12 );

ただし、usersコレクションに対してアサートするためにhasメソッドを2回別々に呼び出す代わりに、3番目のパラメータとしてクロージャを提供する1回の呼び出しを行うことができます。そうすると、クロージャは自動的に呼び出され、コレクションの最初のアイテムにスコープが設定されます。

1$response
2 ->assertJson(fn (AssertableJson $json) =>
3 $json->has('meta')
4 ->has('users', 3, fn (AssertableJson $json) =>
5 $json->where('id', 1)
6 ->where('name', 'Victoria Faith')
7 ->where('email', fn (string $email) => str($email)->is('[email protected]'))
8 ->missing('password')
9 ->etc()
10 )
11 );

JSONの型をアサートする

JSONレスポンスのプロパティが特定の型であることをアサートしたいだけの場合があります。Illuminate\Testing\Fluent\AssertableJsonクラスは、そのためのwhereTypeおよびwhereAllTypeメソッドを提供します。

1$response->assertJson(fn (AssertableJson $json) =>
2 $json->whereType('id', 'integer')
3 ->whereAllType([
4 'users.0.name' => 'string',
5 'meta' => 'array'
6 ])
7);

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

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

whereTypeおよびwhereAllTypeメソッドは、次の型を認識します:stringintegerdoublebooleanarray、およびnull

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

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

1<?php
2 
3use Illuminate\Http\UploadedFile;
4use Illuminate\Support\Facades\Storage;
5 
6test('avatars can be uploaded', function () {
7 Storage::fake('avatars');
8 
9 $file = UploadedFile::fake()->image('avatar.jpg');
10 
11 $response = $this->post('/avatar', [
12 'avatar' => $file,
13 ]);
14 
15 Storage::disk('avatars')->assertExists($file->hashName());
16});
1<?php
2 
3namespace Tests\Feature;
4 
5use Illuminate\Http\UploadedFile;
6use Illuminate\Support\Facades\Storage;
7use Tests\TestCase;
8 
9class ExampleTest extends TestCase
10{
11 public function test_avatars_can_be_uploaded(): void
12 {
13 Storage::fake('avatars');
14 
15 $file = UploadedFile::fake()->image('avatar.jpg');
16 
17 $response = $this->post('/avatar', [
18 'avatar' => $file,
19 ]);
20 
21 Storage::disk('avatars')->assertExists($file->hashName());
22 }
23}

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

1Storage::fake('avatars');
2 
3// ...
4 
5Storage::disk('avatars')->assertMissing('missing.jpg');

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

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

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

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

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

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

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

ビューのテスト

Laravelでは、アプリケーションへのシミュレートされたHTTPリクエストを行わずにビューをレンダリングすることもできます。これを実現するには、テスト内でviewメソッドを呼び出します。viewメソッドは、ビュー名とオプションのデータ配列を受け入れます。このメソッドはIlluminate\Testing\TestViewのインスタンスを返し、ビューの内容について便利なアサーションを行うためのいくつかのメソッドを提供します。

1<?php
2 
3test('a welcome view can be rendered', function () {
4 $view = $this->view('welcome', ['name' => 'Taylor']);
5 
6 $view->assertSee('Taylor');
7});
1<?php
2 
3namespace Tests\Feature;
4 
5use Tests\TestCase;
6 
7class ExampleTest extends TestCase
8{
9 public function test_a_welcome_view_can_be_rendered(): void
10 {
11 $view = $this->view('welcome', ['name' => 'Taylor']);
12 
13 $view->assertSee('Taylor');
14 }
15}

TestViewクラスは、次のアサーションメソッドを提供します:assertSeeassertSeeInOrderassertSeeTextassertSeeTextInOrderassertDontSee、およびassertDontSeeText

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

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

エラーの共有

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

1$view = $this->withViewErrors([
2 'name' => ['Please provide a valid name.']
3])->view('form');
4 
5$view->assertSee('Please provide a valid name.');

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

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

1$view = $this->blade(
2 '<x-component :name="$name" />',
3 ['name' => 'Taylor']
4);
5 
6$view->assertSee('Taylor');

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

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

利用可能なアサーション

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

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

assertBadRequest

レスポンスが不正なリクエスト(400)のHTTPステータスコードを持つことをアサートします。

1$response->assertBadRequest();

assertAccepted

レスポンスが受理済み(202)のHTTPステータスコードを持つことをアサートします。

1$response->assertAccepted();

assertConflict

レスポンスが競合(409)のHTTPステータスコードを持つことをアサートします。

1$response->assertConflict();

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

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

レスポンスに指定のクッキーが含まれており、それが期限切れであることをアサートします。

1$response->assertCookieExpired($cookieName);

レスポンスに指定のクッキーが含まれており、それが期限切れでないことをアサートします。

1$response->assertCookieNotExpired($cookieName);

レスポンスに指定のクッキーが含まれていないことをアサートします。

1$response->assertCookieMissing($cookieName);

assertCreated

レスポンスが201のHTTPステータスコードを持つことをアサートします。

1$response->assertCreated();

assertDontSee

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

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

assertDontSeeText

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

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

assertDownload

レスポンスが「ダウンロード」であることをアサートします。通常、これはレスポンスを返した呼び出し元のルートがResponse::downloadレスポンス、BinaryFileResponse、またはStorage::downloadレスポンスを返したことを意味します。

1$response->assertDownload();

必要であれば、ダウンロード可能なファイルに指定のファイル名が割り当てられていることをアサートできます。

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

assertExactJson

レスポンスが指定のJSONデータと完全に一致することを含んでいることをアサートします。

1$response->assertExactJson(array $data);

assertExactJsonStructure

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

1$response->assertExactJsonStructure(array $data);

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

assertForbidden

レスポンスが禁止(403)のHTTPステータスコードを持つことをアサートします。

1$response->assertForbidden();

assertFound

レスポンスが発見(302)のHTTPステータスコードを持つことをアサートします。

1$response->assertFound();

assertGone

レスポンスが存在しない(410)のHTTPステータスコードを持つことをアサートします。

1$response->assertGone();

assertHeader

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

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

assertHeaderMissing

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

1$response->assertHeaderMissing($headerName);

assertInternalServerError

レスポンスが「内部サーバーエラー」(500)のHTTPステータスコードを持つことをアサートします。

1$response->assertInternalServerError();

assertJson

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

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

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

assertJsonCount

レスポンスのJSONが、指定されたキーに期待される数のアイテムを持つ配列を持っていることをアサートします。

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

assertJsonFragment

レスポンス内のどこかに指定のJSONデータが含まれていることをアサートします。

1Route::get('/users', function () {
2 return [
3 'users' => [
4 [
5 'name' => 'Taylor Otwell',
6 ],
7 ],
8 ];
9});
10 
11$response->assertJsonFragment(['name' => 'Taylor Otwell']);

assertJsonIsArray

レスポンスのJSONが配列であることをアサートします。

1$response->assertJsonIsArray();

assertJsonIsObject

レスポンスのJSONがオブジェクトであることをアサートします。

1$response->assertJsonIsObject();

assertJsonMissing

レスポンスに指定のJSONデータが含まれていないことをアサートします。

1$response->assertJsonMissing(array $data);

assertJsonMissingExact

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

1$response->assertJsonMissingExact(array $data);

assertJsonMissingValidationErrors

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

1$response->assertJsonMissingValidationErrors($keys);

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

assertJsonPath

レスポンスが指定されたパスに指定のデータを含んでいることをアサートします。

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

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

1{
2 "user": {
3 "name": "Steve Schoger"
4 }
5}

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

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

assertJsonMissingPath

レスポンスに指定のパスが含まれていないことをアサートします。

1$response->assertJsonMissingPath($path);

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

1{
2 "user": {
3 "name": "Steve Schoger"
4 }
5}

userオブジェクトのemailプロパティが含まれていないことをアサートできます。

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

assertJsonStructure

レスポンスが指定のJSON構造を持っていることをアサートします。

1$response->assertJsonStructure(array $structure);

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

1{
2 "user": {
3 "name": "Steve Schoger"
4 }
5}

JSON構造が期待通りであることを次のようにアサートできます。

1$response->assertJsonStructure([
2 'user' => [
3 'name',
4 ]
5]);

アプリケーションから返されるJSONレスポンスには、オブジェクトの配列が含まれていることがあります。

1{
2 "user": [
3 {
4 "name": "Steve Schoger",
5 "age": 55,
6 "location": "Earth"
7 },
8 {
9 "name": "Mary Schoger",
10 "age": 60,
11 "location": "Earth"
12 }
13 ]
14}

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

1$response->assertJsonStructure([
2 'user' => [
3 '*' => [
4 'name',
5 'age',
6 'location'
7 ]
8 ]
9]);

assertJsonValidationErrors

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

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

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

assertJsonValidationErrorFor

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

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

assertMethodNotAllowed

レスポンスがメソッド不許可(405)のHTTPステータスコードを持つことをアサートします。

1$response->assertMethodNotAllowed();

assertMovedPermanently

レスポンスが恒久的に移動(301)のHTTPステータスコードを持つことをアサートします。

1$response->assertMovedPermanently();

assertLocation

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

1$response->assertLocation($uri);

assertContent

指定の文字列がレスポンスのコンテンツと一致することをアサートします。

1$response->assertContent($value);

assertNoContent

レスポンスが指定のHTTPステータスコードを持ち、コンテンツがないことをアサートします。

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

assertStreamedContent

指定の文字列がストリームされたレスポンスのコンテンツと一致することをアサートします。

1$response->assertStreamedContent($value);

assertNotFound

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

1$response->assertNotFound();

assertOk

レスポンスが200のHTTPステータスコードを持つことをアサートします。

1$response->assertOk();

assertPaymentRequired

レスポンスが支払いが必要(402)のHTTPステータスコードを持つことをアサートします。

1$response->assertPaymentRequired();

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

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

assertRedirect

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

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

assertRedirectContains

レスポンスが、指定の文字列を含むURIにリダイレクトしているかどうかをアサートします。

1$response->assertRedirectContains($string);

assertRedirectToRoute

レスポンスが指定された名前付きルートへのリダイレクトであることをアサートします。

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

assertRedirectToSignedRoute

レスポンスが指定された署名付きルートへのリダイレクトであることをアサートします。

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

assertRequestTimeout

レスポンスがリクエストタイムアウト(408)のHTTPステータスコードを持つことをアサートします。

1$response->assertRequestTimeout();

assertSee

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

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

assertSeeInOrder

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

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

assertSeeText

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

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

assertSeeTextInOrder

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

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

assertServerError

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

1$response->assertServerError();

assertServiceUnavailable

レスポンスが「サービス利用不可」(503)のHTTPステータスコードを持つことをアサートします。

1$response->assertServiceUnavailable();

assertSessionHas

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

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

必要であれば、assertSessionHasメソッドの2番目の引数としてクロージャを提供できます。クロージャがtrueを返した場合、アサーションは成功します。

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

assertSessionHasInput

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

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

必要であれば、assertSessionHasInputメソッドの2番目の引数としてクロージャを提供できます。クロージャがtrueを返した場合、アサーションは成功します。

1use Illuminate\Support\Facades\Crypt;
2 
3$response->assertSessionHasInput($key, function (string $value) {
4 return Crypt::decryptString($value) === 'secret';
5});

assertSessionHasAll

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

1$response->assertSessionHasAll(array $data);

たとえば、アプリケーションのセッションにnamestatusキーが含まれている場合、両方が存在し、指定された値を持っていることを次のようにアサートできます。

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

assertSessionHasErrors

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

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

たとえば、nameフィールドとemailフィールドにセッションにフラッシュされたバリデーションエラーメッセージがあることをアサートするには、assertSessionHasErrorsメソッドを次のように呼び出すことができます。

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

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

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

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

assertSessionHasErrorsIn

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

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

assertSessionHasNoErrors

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

1$response->assertSessionHasNoErrors();

assertSessionDoesntHaveErrors

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

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

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

assertSessionMissing

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

1$response->assertSessionMissing($key);

assertStatus

レスポンスが指定のHTTPステータスコードを持つことをアサートします。

1$response->assertStatus($code);

assertSuccessful

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

1$response->assertSuccessful();

assertTooManyRequests

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

1$response->assertTooManyRequests();

assertUnauthorized

レスポンスが未認証(401)のHTTPステータスコードを持つことをアサートします。

1$response->assertUnauthorized();

assertUnprocessable

レスポンスが処理不能エンティティ(422)のHTTPステータスコードを持つことをアサートします。

1$response->assertUnprocessable();

assertUnsupportedMediaType

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

1$response->assertUnsupportedMediaType();

assertValid

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

1// Assert that no validation errors are present...
2$response->assertValid();
3 
4// Assert that the given keys do not have validation errors...
5$response->assertValid(['name', 'email']);

assertInvalid

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

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

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

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

assertViewHas

レスポンスビューに指定のデータが含まれていることをアサートします。

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

assertViewHasメソッドの2番目の引数としてクロージャを渡すと、特定のビューデータを検査してアサーションを行うことができます。

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

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

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

assertViewHasAll

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

1$response->assertViewHasAll(array $data);

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

1$response->assertViewHasAll([
2 'name',
3 'email',
4]);

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

1$response->assertViewHasAll([
2 'name' => 'Taylor Otwell',
3 'email' => '[email protected],',
4]);

assertViewIs

指定のビューがルートによって返されたことをアサートします。

1$response->assertViewIs($value);

assertViewMissing

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

1$response->assertViewMissing($key);

認証のアサーション

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

assertAuthenticated

ユーザーが認証されていることをアサートします。

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

assertGuest

ユーザーが認証されていないことをアサートします。

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

assertAuthenticatedAs

特定のユーザーが認証されていることをアサートします。

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

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

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

assertValid

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

1// Assert that no validation errors are present...
2$response->assertValid();
3 
4// Assert that the given keys do not have validation errors...
5$response->assertValid(['name', 'email']);

assertInvalid

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

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

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

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

Laravelは最も生産的な方法です
ソフトウェアを構築、デプロイ、監視します。