HTTPテスト
イントロダクション
Laravelは、アプリケーションへのHTTPリクエストを行い、レスポンスを検証するための非常に流暢なAPIを提供しています。たとえば、以下で定義されている機能テストをご覧ください。
1<?php2 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(): void13 {14 $response = $this->get('/');15 16 $response->assertStatus(200);17 }18}
getメソッドはアプリケーションに対してGETリクエストを行い、assertStatusメソッドは返されたレスポンスが指定のHTTPステータスコードを持つことをアサートします。この単純なアサーションに加えて、Laravelにはレスポンスヘッダ、コンテンツ、JSON構造などを検査するためのさまざまなアサーションも含まれています。
リクエストの実行
アプリケーションにリクエストを行うには、テスト内でget、post、put、patch、またはdeleteメソッドを呼び出します。これらのメソッドは、実際にアプリケーションに対して「本物の」HTTPリクエストを発行するわけではありません。代わりに、ネットワークリクエスト全体が内部でシミュレートされます。
Illuminate\Http\Responseインスタンスを返す代わりに、テストリクエストメソッドはIlluminate\Testing\TestResponseのインスタンスを返します。これには、アプリケーションのレスポンスを検査できる便利なアサーションが様々用意されています。
1<?php2 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(): void13 {14 $response = $this->get('/');15 16 $response->assertStatus(200);17 }18}
一般的に、各テストはアプリケーションに対して1回だけリクエストを行うべきです。1つのテストメソッド内で複数のリクエストを実行すると、予期しない動作が発生する可能性があります。
便宜上、テスト実行時にはCSRFミドルウェアは自動的に無効になります。
リクエストヘッダのカスタマイズ
リクエストがアプリケーションに送信される前に、withHeadersメソッドを使用してリクエストのヘッダをカスタマイズできます。このメソッドを使用すると、リクエストに任意のカスタムヘッダを追加できます。
1<?php2 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(): void13 {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(): void10 {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<?php2 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(): void10 {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(): void11 {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')
レスポンスのデバッグ
アプリケーションにテストリクエストを行った後、dump、dumpHeaders、dumpSessionメソッドを使用して、レスポンスの内容を調査し、デバッグできます。
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(): void13 {14 $response = $this->get('/');15 16 $response->dumpHeaders();17 18 $response->dumpSession();19 20 $response->dump();21 }22}
あるいは、dd、ddHeaders、ddSession、ddJsonメソッドを使用して、レスポンスに関する情報をダンプしてから実行を停止することもできます。
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(): void13 {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 TestCase10{11 /**12 * A basic test example.13 */14 public function test_exception_is_thrown(): void15 {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::class4);
スローされた例外を検査し、それに対してアサーションを行いたい場合は、assertThrowsメソッドの2番目の引数としてクロージャを提供できます。
1$this->assertThrows(2 fn () => (new ProcessOrder)->execute(),3 fn (OrderInvalid $e) => $e->orderId() === 123;4);
JSON APIのテスト
Laravelは、JSON APIとそのレスポンスをテストするためのいくつかのヘルパも提供しています。たとえば、json、getJson、postJson、putJson、patchJson、deleteJson、およびoptionsJsonメソッドを使用して、さまざまなHTTP動詞でJSONリクエストを発行できます。これらのメソッドにデータやヘッダを簡単に渡すこともできます。まず、/api/userにPOSTリクエストを行い、期待される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(): void13 {14 $response = $this->postJson('/api/user', ['name' => 'Sally']);15 16 $response17 ->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(): void13 {14 $response = $this->postJson('/user', ['name' => 'Sally']);15 16 $response17 ->assertStatus(201)18 ->assertExactJson([19 'created' => true,20 ]);21 }22}
JSONパスに対するアサート
JSONレスポンスが指定されたパスに指定のデータを含んでいることを検証したい場合は、assertJsonPathメソッドを使用する必要があります。
1<?php2 3test('asserting a json path value', function () {4 $response = $this->postJson('/user', ['name' => 'Sally']);5 6 $response7 ->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(): void13 {14 $response = $this->postJson('/user', ['name' => 'Sally']);15 16 $response17 ->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')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 $response11 ->assertJson(fn (AssertableJson $json) =>12 $json->where('id', 1)13 ->where('name', 'Victoria Faith')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') 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') 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') 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メソッドは、次の型を認識します:string、integer、double、boolean、array、および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 TestCase10{11 public function test_avatars_can_be_uploaded(): void12 {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<?php2 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(): void10 {11 $view = $this->view('welcome', ['name' => 'Taylor']);12 13 $view->assertSee('Taylor');14 }15}
TestViewクラスは、次のアサーションメソッドを提供します:assertSee、assertSeeInOrder、assertSeeText、assertSeeTextInOrder、assertDontSee、および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クラスは、アプリケーションをテストする際に利用できるさまざまなカスタムアサーションメソッドを提供します。これらのアサーションは、json、get、post、put、deleteなどのテストメソッドから返されるレスポンスでアクセスできます。
assertAccepted assertBadRequest assertConflict assertCookie assertCookieExpired assertCookieNotExpired assertCookieMissing assertCreated assertDontSee assertDontSeeText assertDownload assertExactJson assertExactJsonStructure assertForbidden assertFound assertGone assertHeader assertHeaderMissing assertInternalServerError assertJson assertJsonCount assertJsonFragment assertJsonIsArray assertJsonIsObject assertJsonMissing assertJsonMissingExact assertJsonMissingValidationErrors assertJsonPath assertJsonMissingPath assertJsonStructure assertJsonValidationErrors assertJsonValidationErrorFor assertLocation assertMethodNotAllowed assertMovedPermanently assertContent assertNoContent assertStreamedContent assertNotFound assertOk assertPaymentRequired assertPlainCookie assertRedirect assertRedirectContains assertRedirectToRoute assertRedirectToSignedRoute assertRequestTimeout assertSee assertSeeInOrder assertSeeText assertSeeTextInOrder assertServerError assertServiceUnavailable assertSessionHas assertSessionHasInput assertSessionHasAll assertSessionHasErrors assertSessionHasErrorsIn assertSessionHasNoErrors assertSessionDoesntHaveErrors assertSessionMissing assertStatus assertSuccessful assertTooManyRequests assertUnauthorized assertUnprocessable assertUnsupportedMediaType assertValid assertInvalid assertViewHas assertViewHasAll assertViewIs assertViewMissing
assertBadRequest
レスポンスが不正なリクエスト(400)のHTTPステータスコードを持つことをアサートします。
1$response->assertBadRequest();
assertAccepted
レスポンスが受理済み(202)のHTTPステータスコードを持つことをアサートします。
1$response->assertAccepted();
assertConflict
レスポンスが競合(409)のHTTPステータスコードを持つことをアサートします。
1$response->assertConflict();
assertCookie
レスポンスに指定のクッキーが含まれていることをアサートします。
1$response->assertCookie($cookieName, $value = null);
assertCookieExpired
レスポンスに指定のクッキーが含まれており、それが期限切れであることをアサートします。
1$response->assertCookieExpired($cookieName);
assertCookieNotExpired
レスポンスに指定のクッキーが含まれており、それが期限切れでないことをアサートします。
1$response->assertCookieNotExpired($cookieName);
assertCookieMissing
レスポンスに指定のクッキーが含まれていないことをアサートします。
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();
assertPlainCookie
レスポンスに指定の暗号化されていないクッキーが含まれていることをアサートします。
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);
たとえば、アプリケーションのセッションにnameとstatusキーが含まれている場合、両方が存在し、指定された値を持っていることを次のようにアサートできます。
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',4]);
assertViewIs
指定のビューがルートによって返されたことをアサートします。
1$response->assertViewIs($value);
assertViewMissing
アプリケーションのレスポンスで返されたビューで、指定のデータキーが利用可能になっていないことをアサートします。
1$response->assertViewMissing($key);
認証のアサーション
Laravelは、アプリケーションの機能テスト内で利用できるさまざまな認証関連のアサーションも提供しています。これらのメソッドは、getやpostなどのメソッドから返される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]);