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 構造などを検査するためさまざまなアサーションも含まれています。
リクエストの作成
アプリケーションにリクエストを行うには、テスト内で get
、post
、put
、patch
、または delete
メソッドを呼び出すことができます。これらのメソッドは、実際にはアプリケーションに「 gerçek 」 HTTP リクエストを発行しません。代わりに、ネットワークリクエスト全体が内部でシミュレートされます。
Illuminate\Http\Response
インスタンスを返す代わりに、テストリクエストメソッドは Illuminate\Testing\TestResponse
のインスタンスを返します。これは、アプリケーションのレスポンスを検査できるさまざまな便利なアサーションを提供します。
<?php test('basic request', function () { $response = $this->get('/'); $response->assertStatus(200);});
<?php namespace Tests\Feature; use Tests\TestCase; class ExampleTest extends TestCase{ /** * A basic test example. */ public function test_a_basic_request(): void { $response = $this->get('/'); $response->assertStatus(200); }}
一般的に、各テストはアプリケーションに 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); }}
Cookie
withCookie
または withCookies
メソッドを使用して、リクエストを行う前に Cookie 値を設定できます。withCookie
メソッドは、2 つの引数として Cookie 名と値を受け入れますが、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')
レスポンスのデバッグ
アプリケーションにテストリクエストを行った後、dump
、dumpHeaders
、および dumpSession
メソッドを使用して、レスポンスの内容を調べてデバッグできます。
<?php test('basic test', function () { $response = $this->get('/'); $response->dumpHeaders(); $response->dumpSession(); $response->dump();});
<?php namespace Tests\Feature; use Tests\TestCase; class ExampleTest extends TestCase{ /** * A basic test example. */ public function test_basic_test(): void { $response = $this->get('/'); $response->dumpHeaders(); $response->dumpSession(); $response->dump(); }}
代わりに、dd
、ddHeaders
、および ddSession
メソッドを使用して、レスポンスに関する情報をダンプし、実行を停止することもできます。
<?php test('basic test', function () { $response = $this->get('/'); $response->ddHeaders(); $response->ddSession(); $response->dd();});
<?php namespace Tests\Feature; use Tests\TestCase; class ExampleTest extends TestCase{ /** * 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);
スローされる例外を検査してアサーションを作成する場合は、assertThrows
メソッドの 2 番目の引数としてクロージャを提供できます。
$this->assertThrows( fn () => (new ProcessOrder)->execute(), fn (OrderInvalid $e) => $e->orderId() === 123;);
JSON API のテスト
Laravel は、JSON API とそのレスポンスをテストするためのいくつかのヘルパーも提供します。たとえば、json
、getJson
、postJson
、putJson
、patchJson
、deleteJson
、および optionsJson
メソッドを使用して、さまざまな HTTP 動詞で JSON リクエストを発行できます。また、これらのメソッドにデータとヘッダーを簡単に渡すこともできます。始めるには、/api/user
に POST
リクエストを作成し、予期される 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 レスポンス内に存在することを検証します。したがって、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);
Fluent JSON テスト
Laravelは、アプリケーションのJSONレスポンスを流暢にテストするための美しい方法も提供しています。始めるには、assertJson
メソッドにクロージャを渡します。このクロージャは、Illuminate\Testing\Fluent\AssertableJson
のインスタンスと共に呼び出され、アプリケーションから返されたJSONに対してアサーションを実行するために使用できます。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') ->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') ->whereNot('status', 'pending') ->missing('password') ->etc() );}
etc
メソッドについて
上記の例では、アサーションチェーンの最後にetc
メソッドを呼び出していることに気付いたかもしれません。このメソッドは、JSONオブジェクトに他の属性が存在する可能性があることをLaravelに通知します。etc
メソッドを使用しない場合、アサーションを実行しなかった他の属性がJSONオブジェクトに存在すると、テストは失敗します。
この動作の意図は、属性に対して明示的にアサーションを実行するか、etc
メソッドを介して追加の属性を明示的に許可することにより、JSONレスポンスで機密情報を意図せずに公開することを防ぐことです。
ただし、アサーションチェーンにetc
メソッドを含めなくても、JSONオブジェクト内にネストされている配列に追加の属性が追加されていないことが保証されるわけではないことに注意してください。etc
メソッドは、etc
メソッドが呼び出されたネストレベルに追加の属性が存在しないことのみを保証します。
属性の存在/不在のアサーション
属性が存在するか不在であるかをアサートするには、has
メソッドとmissing
メソッドを使用できます。
$response->assertJson(fn (AssertableJson $json) => $json->has('data') ->missing('message'));
さらに、hasAll
メソッドとmissingAll
メソッドを使用すると、複数の属性の存在または不在を同時にアサートできます。
$response->assertJson(fn (AssertableJson $json) => $json->hasAll(['status', 'data']) ->missingAll(['message', 'code']));
hasAny
メソッドを使用して、指定された属性リストの少なくとも1つが存在するかどうかを判断できます。
$response->assertJson(fn (AssertableJson $json) => $json->has('status') ->hasAny('data', 'message', 'code'));
JSONコレクションに対するアサーション
多くの場合、ルートは複数のユーザーなど、複数のアイテムを含むJSONレスポンスを返します。
Route::get('/users', function () { return User::all();});
このような状況では、Fluent 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') ->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') ->missing('password') ->etc() ) );
ただし、users
コレクションに対してアサーションを実行するためにhas
メソッドを2回個別に呼び出す代わりに、3番目のパラメーターとしてクロージャを提供する1回の呼び出しを行うことができます。そうすると、クロージャは自動的に呼び出され、コレクションの最初のアイテムにスコープが設定されます。
$response ->assertJson(fn (AssertableJson $json) => $json->has('meta') ->has('users', 3, fn (AssertableJson $json) => $json->where('id', 1) ->where('name', 'Victoria Faith') ->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
メソッドと組み合わせることで、ファイルアップロードのテストが大幅に簡素化されます。たとえば、これら2つの機能を組み合わせて、アバターアップロードフォームを簡単にテストできます。
<?php use Illuminate\Http\UploadedFile;use Illuminate\Support\Facades\Storage; test('avatars can be uploaded', function () { Storage::fake('avatars'); $file = UploadedFile::fake()->image('avatar.jpg'); $response = $this->post('/avatar', [ 'avatar' => $file, ]); Storage::disk('avatars')->assertExists($file->hashName());});
<?php namespace Tests\Feature; use Illuminate\Http\UploadedFile;use Illuminate\Support\Facades\Storage;use Tests\TestCase; class ExampleTest extends TestCase{ public function test_avatars_can_be_uploaded(): void { Storage::fake('avatars'); $file = UploadedFile::fake()->image('avatar.jpg'); $response = $this->post('/avatar', [ 'avatar' => $file, ]); Storage::disk('avatars')->assertExists($file->hashName()); }}
特定のファイルが存在しないことをアサートする場合は、Storage
ファサードによって提供されるassertMissing
メソッドを使用できます。
Storage::fake('avatars'); // ... Storage::disk('avatars')->assertMissing('missing.jpg');
偽ファイルのカスタマイズ
UploadedFile
クラスによって提供されるfake
メソッドを使用してファイルを作成する場合、アプリケーションの検証ルールをより適切にテストするために、画像の幅、高さ、およびサイズ(キロバイト単位)を指定できます。
UploadedFile::fake()->image('avatar.jpg', $width, $height)->size(100);
画像の作成に加えて、create
メソッドを使用して他のタイプのファイルを作成できます。
UploadedFile::fake()->create('document.pdf', $sizeInKilobytes);
必要に応じて、$mimeType
引数をメソッドに渡して、ファイルによって返されるMIMEタイプを明示的に定義できます。
UploadedFile::fake()->create( 'document.pdf', $sizeInKilobytes, 'application/pdf');
ビューのテスト
Laravelでは、アプリケーションへのHTTPリクエストをシミュレートせずにビューをレンダリングすることもできます。これを実現するには、テスト内でview
メソッドを呼び出すことができます。view
メソッドは、ビュー名とオプションのデータ配列を受け入れます。このメソッドは、ビューの内容についてアサーションを実行するためのいくつかのメソッドを提供するIlluminate\Testing\TestView
のインスタンスを返します。
<?php test('a welcome view can be rendered', function () { $view = $this->view('welcome', ['name' => 'Taylor']); $view->assertSee('Taylor');});
<?php namespace Tests\Feature; use Tests\TestCase; class ExampleTest extends TestCase{ public function test_a_welcome_view_can_be_rendered(): void { $view = $this->view('welcome', ['name' => 'Taylor']); $view->assertSee('Taylor'); }}
TestView
クラスは、次のアサーションメソッドを提供します:assertSee
、assertSeeInOrder
、assertSeeText
、assertSeeTextInOrder
、assertDontSee
、およびassertDontSeeText
.
必要に応じて、TestView
インスタンスを文字列にキャストすることにより、レンダリングされた生のビューコンテンツを取得できます.
$contents = (string) $this->view('welcome');
エラーの共有
一部のビューは、Laravelによって提供されるグローバルエラーバッグで共有されるエラーに依存する場合があります。エラーバッグにエラーメッセージを入力するには、withViewErrors
メソッドを使用できます。
$view = $this->withViewErrors([ 'name' => ['Please provide a valid name.']])->view('form'); $view->assertSee('Please provide a valid name.');
Blade とコンポーネントのレンダリング
必要に応じて、blade
メソッドを使用して、生のBlade文字列を評価およびレンダリングできます。view
メソッドと同様に、blade
メソッドはIlluminate\Testing\TestView
のインスタンスを返します。
$view = $this->blade( '<x-component :name="$name" />', ['name' => 'Taylor']); $view->assertSee('Taylor');
Bladeコンポーネントを評価およびレンダリングするには、component
メソッドを使用できます。 component
メソッドは、Illuminate\Testing\TestComponent
のインスタンスを返します.
$view = $this->component(Profile::class, ['name' => 'Taylor']); $view->assertSee('Taylor');
利用可能なアサーション
レスポンスアサーション
LaravelのIlluminate\Testing\TestResponse
クラスは、アプリケーションのテスト時に利用できるさまざまなカスタムアサーションメソッドを提供します。これらのアサーションは、json
、get
、post
、put
、およびdelete
テストメソッドによって返されるレスポンスでアクセスできます.
(アサーションメソッドのリスト 省略)
assertBadRequest
レスポンスに不正なリクエスト(400)HTTPステータスコードがあることをアサートします。
$response->assertBadRequest();
assertAccepted
レスポンスに受け入れられた(202)HTTPステータスコードがあることをアサートします。
$response->assertAccepted();
assertConflict
レスポンスに競合(409)HTTPステータスコードがあることをアサートします。
$response->assertConflict();
assertCookie
レスポンスに指定されたCookieが含まれていることをアサートします。
$response->assertCookie($cookieName, $value = null);
assertCookieExpired
レスポンスに指定されたCookieが含まれており、期限切れであることをアサートします。
$response->assertCookieExpired($cookieName);
assertCookieNotExpired
レスポンスに指定されたCookieが含まれており、期限切れでないことをアサートします。
$response->assertCookieNotExpired($cookieName);
assertCookieMissing
レスポンスに指定されたCookieが含まれていないことをアサートします。
$response->assertCookieMissing($cookieName);
assertCreated
レスポンスに201 HTTPステータスコードがあることをアサートします。
$response->assertCreated();
assertDontSee
指定された文字列が、アプリケーションによって返されたレスポンス内に含まれていないことをアサートします。2番目の引数にfalse
を渡さない限り、このアサーションは指定された文字列を自動的にエスケープします。
$response->assertDontSee($value, $escaped = true);
assertDontSeeText
指定された文字列がレスポンステキスト内に含まれていないことをアサートします。2番目の引数に`false`を渡さない限り、このアサーションは指定された文字列を自動的にエスケープします。このメソッドは、アサーションを実行する前に、レスポンスコンテンツをPHP関数の`strip_tags`に渡します。
$response->assertDontSeeText($value, $escaped = true);
assertDownload
レスポンスが「ダウンロード」であることをアサートします。通常、これは、レスポンスを返した呼び出されたルートが、Response::download
レスポンス、BinaryFileResponse
、またはStorage::download
レスポンスを返したことを意味します。
$response->assertDownload();
必要に応じて、ダウンロード可能なファイルに特定のファイル名が割り当てられていることをアサートできます。
$response->assertDownload('image.jpg');
assertExactJson
レスポンスに、指定されたJSONデータと完全に一致するものが含まれていることをアサートします。
$response->assertExactJson(array $data);
assertExactJsonStructure
レスポンスに、指定されたJSON構造と完全に一致するものが含まれていることをアサートします。
$response->assertExactJsonStructure(array $data);
このメソッドは、assertJsonStructureのより厳密なバリアントです。 assertJsonStructure
とは対照的に、このメソッドは、レスポンスに、予期されるJSON構造に明示的に含まれていないキーが含まれている場合に失敗します。
assertForbidden
レスポンスに禁止されている(403)HTTPステータスコードがあることをアサートします。
$response->assertForbidden();
assertFound
レスポンスのHTTPステータスコードが302 (Found)であることをアサートします。
$response->assertFound();
assertGone
レスポンスのHTTPステータスコードが410 (Gone)であることをアサートします。
$response->assertGone();
assertHeader
指定されたヘッダーと値がレスポンスに存在することをアサートします。
$response->assertHeader($headerName, $value = null);
assertHeaderMissing
指定されたヘッダーがレスポンスに存在しないことをアサートします。
$response->assertHeaderMissing($headerName);
assertInternalServerError
レスポンスのHTTPステータスコードが500 ("Internal Server Error")であることをアサートします。
$response->assertInternalServerError();
assertJson
レスポンスに指定されたJSONデータが含まれていることをアサートします。
$response->assertJson(array $data, $strict = false);
assertJson
メソッドは、レスポンスを配列に変換して、指定された配列がアプリケーションによって返された JSON レスポンス内に存在することを検証します。したがって、JSON レスポンスに他のプロパティがある場合でも、指定されたフラグメントが存在する限り、このテストはパスします。
assertJsonCount
レスポンスJSONの指定されたキーに、期待される数のアイテムを持つ配列が存在することをアサートします。
$response->assertJsonCount($count, $key = null);
assertJsonFragment
レスポンスのどこかに指定されたJSONデータが含まれていることをアサートします。
Route::get('/users', function () { return [ 'users' => [ [ 'name' => 'Taylor Otwell', ], ], ];}); $response->assertJsonFragment(['name' => 'Taylor Otwell']);
assertJsonIsArray
レスポンスJSONが配列であることをアサートします。
$response->assertJsonIsArray();
assertJsonIsObject
レスポンスJSONがオブジェクトであることをアサートします。
$response->assertJsonIsObject();
assertJsonMissing
レスポンスに指定されたJSONデータが含まれていないことをアサートします。
$response->assertJsonMissing(array $data);
assertJsonMissingExact
レスポンスに指定されたJSONデータが完全に一致する形で含まれていないことをアサートします。
$response->assertJsonMissingExact(array $data);
assertJsonMissingValidationErrors
レスポンスに、指定されたキーに対するJSON検証エラーがないことをアサートします。
$response->assertJsonMissingValidationErrors($keys);
より汎用的な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
レスポンスのHTTPステータスコードが405 (Method Not Allowed)であることをアサートします。
$response->assertMethodNotAllowed();
assertMovedPermanently
レスポンスのHTTPステータスコードが301 (Moved Permanently)であることをアサートします。
$response->assertMovedPermanently();
assertLocation
レスポンスの`Location`ヘッダーに指定されたURI値があることをアサートします。
$response->assertLocation($uri);
assertContent
指定された文字列がレスポンスコンテンツと一致することをアサートします。
$response->assertContent($value);
assertNoContent
レスポンスが指定されたHTTPステータスコードを持ち、コンテンツがないことをアサートします。
$response->assertNoContent($status = 204);
assertStreamedContent
指定された文字列がストリーミングレスポンスコンテンツと一致することをアサートします。
$response->assertStreamedContent($value);
assertNotFound
レスポンスのHTTPステータスコードが404 (Not Found)であることをアサートします。
$response->assertNotFound();
assertOk
レスポンスのHTTPステータスコードが200であることをアサートします。
$response->assertOk();
assertPaymentRequired
レスポンスのHTTPステータスコードが402 (Payment Required)であることをアサートします。
$response->assertPaymentRequired();
assertPlainCookie
レスポンスに、指定された暗号化されていないCookieが含まれていることをアサートします。
$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
レスポンスのHTTPステータスコードが408 (Request Timeout)であることをアサートします。
$response->assertRequestTimeout();
assertSee
レスポンスに指定された文字列が含まれていることをアサートします。このアサーションは、2番目の引数として`false`を渡さない限り、指定された文字列を自動的にエスケープします。
$response->assertSee($value, $escaped = true);
assertSeeInOrder
レスポンスに指定された文字列が順番に含まれていることをアサートします。このアサーションは、2番目の引数として`false`を渡さない限り、指定された文字列を自動的にエスケープします。
$response->assertSeeInOrder(array $values, $escaped = true);
assertSeeText
レスポンステキストに指定された文字列が含まれていることをアサートします。このアサーションは、2番目の引数として`false`を渡さない限り、指定された文字列を自動的にエスケープします。アサーションが行われる前に、レスポンスコンテンツはPHP関数の`strip_tags`に渡されます。
$response->assertSeeText($value, $escaped = true);
assertSeeTextInOrder
レスポンステキストに指定された文字列が順番に含まれていることをアサートします。このアサーションは、2番目の引数として`false`を渡さない限り、指定された文字列を自動的にエスケープします。アサーションが行われる前に、レスポンスコンテンツはPHP関数の`strip_tags`に渡されます。
$response->assertSeeTextInOrder(array $values, $escaped = true);
assertServerError
レスポンスのHTTPステータスコードがサーバーエラー(>= 500、< 600)であることをアサートします。
$response->assertServerError();
assertServiceUnavailable
レスポンスのHTTPステータスコードが503 ("Service Unavailable")であることをアサートします。
$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);
たとえば、アプリケーションのセッションに`name`キーと`status`キーが含まれている場合、両方が存在し、指定された値を持っていることを次のようにアサートできます。
$response->assertSessionHasAll([ 'name' => 'Taylor Otwell', 'status' => 'active',]);
assertSessionHasErrors
セッションに、指定された`$keys`のエラーが含まれていることをアサートします。 `$keys`が連想配列の場合、セッションに各フィールド(キー)の特定のエラーメッセージ(値)が含まれていることをアサートします。このメソッドは、検証エラーをJSON構造として返すのではなく、セッションにフラッシュするルートをテストする場合に使用します。
$response->assertSessionHasErrors( array $keys = [], $format = null, $errorBag = 'default');
たとえば、`name`フィールドと`email`フィールドにセッションにフラッシュされた検証エラーメッセージがあることをアサートするには、`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
レスポンスのHTTPステータスコードが成功(>= 200および< 300)であることをアサートします。
$response->assertSuccessful();
assertTooManyRequests
レスポンスのHTTPステータスコードが429 (Too Many Requests)であることをアサートします。
$response->assertTooManyRequests();
assertUnauthorized
レスポンスのHTTPステータスコードが401 (Unauthorized)であることをアサートします。
$response->assertUnauthorized();
assertUnprocessable
レスポンスのHTTPステータスコードが422 (Unprocessable Entity)であることをアサートします。
$response->assertUnprocessable();
assertUnsupportedMediaType
レスポンスのHTTPステータスコードが415 (Unsupported Media Type)であることをアサートします。
$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',]);
assertViewIs
ルートによって指定されたビューが返されたことをアサートします。
$response->assertViewIs($value);
assertViewMissing
指定されたデータキーが、アプリケーションのレスポンスで返されたビューで使用できなかったことをアサートします。
$response->assertViewMissing($key);
認証アサーション
Laravelは、アプリケーションの機能テスト内で利用できる、認証関連のアサーションも多数提供しています。これらのメソッドは、`get`や`post`などのメソッドによって返される`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',]);