はじめに

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

  1. <?php
  2. test('the application returns a successful response', function () {
  3. $response = $this->get('/');
  4. $response->assertStatus(200);
  5. });
  1. <?php
  2. namespace Tests\Feature;
  3. use Tests\TestCase;
  4. class ExampleTest extends TestCase
  5. {
  6. /**
  7. * A basic test example.
  8. */
  9. public function test_the_application_returns_a_successful_response(): void
  10. {
  11. $response = $this->get('/');
  12. $response->assertStatus(200);
  13. }
  14. }
  1. <a name="making-requests"></a>
  2. ## リクエストの作成
  3. アプリケーションにリクエストを作成するには、テスト内で`````get`````、`````post`````、`````put`````、`````patch`````、または`````delete`````メソッドを呼び出すことができます。これらのメソッドは、実際にアプリケーションに対して「本物の」HTTPリクエストを発行するわけではありません。代わりに、ネットワークリクエスト全体が内部でシミュレートされます。
  4. `````Illuminate\Http\Response`````インスタンスを返す代わりに、テストリクエストメソッドは`````Illuminate\Testing\TestResponse`````のインスタンスを返し、アプリケーションのレスポンスを検査するための[さまざまな便利な主張](#available-assertions)を提供します:
  5. ``````php
  6. <?php
  7. test('basic request', function () {
  8. $response = $this->get('/');
  9. $response->assertStatus(200);
  10. });
  11. `
  1. <?php
  2. namespace Tests\Feature;
  3. use Tests\TestCase;
  4. class ExampleTest extends TestCase
  5. {
  6. /**
  7. * A basic test example.
  8. */
  9. public function test_a_basic_request(): void
  10. {
  11. $response = $this->get('/');
  12. $response->assertStatus(200);
  13. }
  14. }

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

便利なことに、テストを実行する際にCSRFミドルウェアは自動的に無効になります。

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

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

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

クッキー

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

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

セッション / 認証

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

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

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

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

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

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

レスポンスのデバッグ

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

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

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

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

例外処理

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

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

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

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

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

  1. $response = $this->withoutDeprecationHandling()->get('/');
  1. ``````php
  2. $this->assertThrows(
  3. fn () => (new ProcessOrder)->execute(),
  4. OrderInvalid::class
  5. );
  6. `

スローされた例外を検査し、主張を行いたい場合は、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リクエストを発行できます。これらのメソッドにデータやヘッダーを簡単に渡すこともできます。始めるために、POSTリクエストを/api/userに対して行い、期待されるJSONデータが返されたことを主張するテストを書いてみましょう:

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

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

  1. expect($response['created'])->toBeTrue();
  1. $this->assertTrue($response['created']);
  1. <a name="verifying-exact-match"></a>
  2. #### 正確なJSONマッチの主張
  3. 前述のように、`````assertJson`````メソッドを使用して、JSONのフラグメントがJSONレスポンス内に存在することを主張できます。アプリケーションによって返されたJSONが特定の配列と**正確に一致する**ことを確認したい場合は、`````assertExactJson`````メソッドを使用する必要があります:
  4. ``````php
  5. <?php
  6. test('asserting an exact json match', function () {
  7. $response = $this->postJson('/user', ['name' => 'Sally']);
  8. $response
  9. ->assertStatus(201)
  10. ->assertExactJson([
  11. 'created' => true,
  12. ]);
  13. });
  14. `
  1. <?php
  2. namespace Tests\Feature;
  3. use Tests\TestCase;
  4. class ExampleTest extends TestCase
  5. {
  6. /**
  7. * A basic functional test example.
  8. */
  9. public function test_asserting_an_exact_json_match(): void
  10. {
  11. $response = $this->postJson('/user', ['name' => 'Sally']);
  12. $response
  13. ->assertStatus(201)
  14. ->assertExactJson([
  15. 'created' => true,
  16. ]);
  17. }
  18. }

JSONパスに対する主張

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

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

流暢なJSONテスト

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

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

etcメソッドの理解

上記の例では、主張チェーンの最後にetcメソッドを呼び出したことに気付いたかもしれません。このメソッドは、LaravelにJSONオブジェクトに他の属性が存在する可能性があることを通知します。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. );
  1. ``````php
  2. $response->assertJson(fn (AssertableJson $json) =>
  3. $json->has('status')
  4. ->hasAny('data', 'message', 'code')
  5. );
  6. `

JSONコレクションに対する主張

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

  1. Route::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(''))
  8. ->missing('password')
  9. ->etc()
  10. )
  11. );

JSONコレクション主張のスコープ

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

  1. Route::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(''))
  9. ->missing('password')
  10. ->etc()
  11. )
  12. );

ただし、usersコレクションに対してhasメソッドを2回別々に呼び出すのではなく、3番目のパラメータとしてクロージャを提供する単一の呼び出しを行うことができます。この場合、クロージャは自動的に呼び出され、コレクション内の最初のアイテムにスコープされます:

  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(''))
  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. );
  1. ``````php
  2. $response->assertJson(fn (AssertableJson $json) =>
  3. $json->whereType('name', 'string|null')
  4. ->whereType('id', ['string', 'integer'])
  5. );
  6. `

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

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

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

指定されたファイルが存在しないことを主張したい場合は、Storageファサードによって提供されるassertMissingメソッドを使用できます:

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

ファイルのカスタマイズ

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

画像を作成するだけでなく、createメソッドを使用して他のタイプのファイルを作成することもできます:

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

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

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

ビューのテスト

Laravelは、アプリケーションに対してシミュレートされたHTTPリクエストを行うことなくビューをレンダリングすることも許可します。これを達成するには、テスト内でviewメソッドを呼び出します。viewメソッドは、ビュー名とオプションのデータ配列を受け取ります。このメソッドは、ビューの内容に関して便利に主張を行うためのいくつかのメソッドを提供するIlluminate\Testing\TestViewのインスタンスを返します:

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

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. $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. $view->assertSee('Taylor');
  1. ``````php
  2. $view = $this->component(Profile::class, ['name' => 'Taylor']);
  3. $view->assertSee('Taylor');
  4. `

利用可能な主張

レスポンスの主張

LaravelのIlluminate\Testing\TestResponseクラスは、アプリケーションをテストする際に利用できるさまざまなカスタム主張メソッドを提供します。これらの主張は、jsongetpostput、および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

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

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

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

assertDontSeeText

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

  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);
  1. <a name="assert-json-count"></a>
  2. #### assertJsonCount
  3. レスポンスJSONが指定されたキーに期待される数のアイテムを持つ配列であることを主張します:
  4. ``````php
  5. $response->assertJsonCount($count, $key = null);
  6. `

assertJsonFragment

レスポンスがどこかに指定されたJSONデータを含むことを主張します:

  1. Route::get('/users', function () {
  2. return [
  3. 'users' => [
  4. [
  5. 'name' => 'Taylor Otwell',
  6. ],
  7. ],
  8. ];
  9. });
  10. $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. }
  1. ``````php
  2. $response->assertJsonPath('user.name', 'Steve Schoger');
  3. `

assertJsonMissingPath

レスポンスが指定されたパスを含まないことを主張します:

  1. $response->assertJsonMissingPath($path);

例えば、アプリケーションによって返された次のJSONレスポンスがある場合:

  1. {
  2. "user": {
  3. "name": "Steve Schoger"
  4. }
  5. }
  1. ``````php
  2. $response->assertJsonMissingPath('user.email');
  3. `

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

指定されたnamed routeへのリダイレクトであることを確認します:

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

assertRedirectToSignedRoute

指定されたsigned routeへのリダイレクトであることを確認します:

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

assertRequestTimeout

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

  1. $response->assertRequestTimeout();

assertSee

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

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

assertSeeInOrder

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

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

assertSeeText

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

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

assertSeeTextInOrder

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

  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を返す場合、アサーションは成功します:

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

assertSessionHasAll

セッションが指定されたキー/値ペアの配列を含んでいることを確認します:

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

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

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

assertSessionHasErrors

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

  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. // Assert that the given keys do not have validation errors...
  4. $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. });

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

  1. expect($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' => ',',
  4. ]);

assertViewIs

指定されたビューがルートによって返されたことを確認します:

  1. $response->assertViewIs($value);

assertViewMissing

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

  1. $response->assertViewMissing($key);

Authentication Assertions

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

assertAuthenticated

ユーザーが認証されていることを確認します:

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

assertGuest

ユーザーが認証されていないことを確認します:

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

assertAuthenticatedAs

特定のユーザーが認証されていることを確認します:

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

Validation Assertions

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

assertValid

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

  1. // Assert that no validation errors are present...
  2. $response->assertValid();
  3. // Assert that the given keys do not have validation errors...
  4. $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. ]);