#はじめに
Laravelは、アプリケーションへのHTTPリクエストを簡潔に行い、レスポンスを検証するための非常に使いやすいAPIを提供します。例えば、以下の機能テストを見てみましょう。
<?php
namespace Tests\Feature;
use Tests\TestCase;
class ExampleTest extends TestCase
{
/**
* 基本的なテストの例です。
*/
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 メソッドを呼び出せます。これらのメソッドは実際の「リアルな」HTTPリクエストを送信するわけではなく、内部でネットワークリクエストをシミュレートします。
テストのリクエストメソッドは Illuminate\Http\Response インスタンスを返す代わりに、Illuminate\Testing\TestResponse のインスタンスを返します。これにより、アプリケーションのレスポンスを検査するためのさまざまな便利なアサーションが利用できます。
<?php
namespace Tests\Feature;
use Tests\TestCase;
class ExampleTest extends TestCase
{
/**
* 基本的なリクエストのテスト例です。
*/
public function test_a_basic_request(): void
{
$response = $this->get('/');
$response->assertStatus(200);
}
}
一般的に、各テストはアプリケーションに対して1回のリクエストのみを行うべきです。1つのテストメソッド内で複数のリクエストを実行すると、予期しない動作が起こる可能性があります。
便利なことに、テスト実行時はCSRFミドルウェアが自動的に無効化されます。
#リクエストヘッダーのカスタマイズ
withHeaders メソッドを使うと、リクエストを送信する前にヘッダーをカスタマイズできます。このメソッドで任意のカスタムヘッダーをリクエストに追加できます。
<?php
namespace Tests\Feature;
use Tests\TestCase;
class ExampleTest extends TestCase
{
/**
* 基本的な機能テストの例です。
*/
public function test_interacting_with_headers(): void
{
$response = $this->withHeaders([
'X-Header' => 'Value',
])->post('/user', ['name' => 'Sally']);
$response->assertStatus(201);
}
}
#クッキー
withCookie または withCookies メソッドを使って、リクエスト前にクッキーの値を設定できます。withCookie はクッキー名と値の2つの引数を受け取り、withCookies は名前と値のペアの配列を受け取ります。
<?php
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
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
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
namespace Tests\Feature;
use Tests\TestCase;
class ExampleTest extends TestCase
{
/**
* 基本的なテストの例です。
*/
public function test_basic_test(): void
{
$response = $this->get('/');
$response->dumpHeaders();
$response->dumpSession();
$response->dump();
}
}
または、dd、ddHeaders、ddSession メソッドを使ってレスポンス情報をダンプし、その後実行を停止できます。
<?php
namespace Tests\Feature;
use Tests\TestCase;
class ExampleTest extends TestCase
{
/**
* 基本的なテストの例です。
*/
public function test_basic_test(): void
{
$response = $this->get('/');
$response->ddHeaders();
$response->ddSession();
$response->dd();
}
}
#例外処理
アプリケーションが特定の例外を投げることをテストしたい場合があります。Laravelの例外ハンドラーにキャッチされHTTPレスポンスとして返されないようにするには、リクエスト前に withoutExceptionHandling メソッドを呼び出します。
$response = $this->withoutExceptionHandling()->get('/');
また、PHP言語や使用しているライブラリで非推奨となった機能をアプリケーションが使っていないか確認したい場合は、リクエスト前に withoutDeprecationHandling メソッドを呼び出せます。非推奨処理を無効にすると、非推奨警告が例外に変換され、テストが失敗します。
$response = $this->withoutDeprecationHandling()->get('/');
assertThrows メソッドは、指定したクロージャ内のコードが特定の例外を投げることを検証できます。
$this->assertThrows(
fn () => (new ProcessOrder)->execute(),
OrderInvalid::class
);
#JSON APIのテスト
LaravelはJSON APIとそのレスポンスをテストするためのいくつかのヘルパーも提供します。例えば、json、getJson、postJson、putJson、patchJson、deleteJson、optionsJson メソッドを使って、さまざまなHTTP動詞でJSONリクエストを送信できます。これらのメソッドにはデータやヘッダーも簡単に渡せます。まずは、POST リクエストを /api/user に送信し、期待するJSONデータが返ることを検証するテストを書いてみましょう。
<?php
namespace Tests\Feature;
use Tests\TestCase;
class ExampleTest extends TestCase
{
/**
* 基本的な機能テストの例です。
*/
public function test_making_an_api_request(): void
{
$response = $this->postJson('/api/user', ['name' => 'Sally']);
$response
->assertStatus(201)
->assertJson([
'created' => true,
]);
}
}
さらに、JSONレスポンスのデータは配列のようにアクセスできるため、返されたJSONの個々の値を簡単に検査できます。
$this->assertTrue($response['created']);
assertJson メソッドはレスポンスを配列に変換し、PHPUnit::assertArraySubset を使って指定した配列がJSONレスポンス内に存在することを検証します。つまり、JSONレスポンスに他のプロパティがあっても、指定した断片が含まれていればテストは成功します。
#JSONの完全一致を検証する
前述の通り、assertJson メソッドはJSONレスポンス内に断片が存在することを検証します。もし、指定した配列がアプリケーションから返されたJSONと完全に一致することを検証したい場合は、assertExactJson メソッドを使います。
<?php
namespace Tests\Feature;
use Tests\TestCase;
class ExampleTest extends TestCase
{
/**
* 基本的な機能テストの例です。
*/
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
namespace Tests\Feature;
use Tests\TestCase;
class ExampleTest extends TestCase
{
/**
* 基本的な機能テストの例です。
*/
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;
/**
* 基本的な機能テストの例です。
*/
public function test_fluent_json(): void
{
$response = $this->getJson('/users/1');
$response
->assertJson(fn (AssertableJson $json) =>
$json->where('id', 1)
->where('name', 'Victoria Faith')
->where('email', fn (string $email) => str($email)->is('[email protected]'))
->whereNot('status', 'pending')
->missing('password')
->etc()
);
}
#etc メソッドの理解
上記の例では、アサーションチェーンの最後に etc メソッドを呼び出していることに気づいたかもしれません。このメソッドは、JSONオブジェクトに他の属性が存在する可能性があることを Laravel に伝えます。etc メソッドを使用しない場合、アサーションしていない他の属性が JSON オブジェクトに存在するとテストは失敗します。
この動作の意図は、JSONレスポンスに意図せず機密情報を含めてしまうのを防ぐためで、属性に対して明示的にアサーションを行うか、etc メソッドで追加の属性を許可する必要があります。
ただし、アサーションチェーンに etc メソッドを含めないからといって、JSONオブジェクト内にネストされた配列に追加の属性が加えられていないことが保証されるわけではない点に注意してください。etc メソッドは、etc を呼び出したネストレベルにおいてのみ、追加の属性が存在しないことを保証します。
#属性の存在・非存在のアサーション
属性が存在するか、存在しないことをアサートするには、has と missing メソッドを使います:
$response->assertJson(fn (AssertableJson $json) =>
$json->has('data')
->missing('message')
);
さらに、hasAll と missingAll メソッドを使うと、複数の属性の存在・非存在を同時にアサートできます:
$response->assertJson(fn (AssertableJson $json) =>
$json->hasAll(['status', 'data'])
->missingAll(['message', 'code'])
);
hasAny メソッドを使うと、指定した属性のうち少なくとも1つが存在するかどうかを判定できます:
$response->assertJson(fn (AssertableJson $json) =>
$json->has('status')
->hasAny('data', 'message', 'code')
);
#JSONコレクションに対するアサーション
ルートが複数のアイテムを含む JSON レスポンスを返すことがあります。例えば複数のユーザーなどです:
Route::get('/users', function () {
return User::all();
});
このような場合、フルーエントな JSON オブジェクトの has メソッドを使ってレスポンスに含まれるユーザーに対してアサーションできます。例えば、JSONレスポンスに3人のユーザーが含まれていることをアサートし、次にコレクションの最初のユーザーに対して first メソッドでアサーションを行います。first メソッドはクロージャを受け取り、その中で最初のオブジェクトに対するアサーションができます:
$response
->assertJson(fn (AssertableJson $json) =>
$json->has(3)
->first(fn (AssertableJson $json) =>
$json->where('id', 1)
->where('name', 'Victoria Faith')
->where('email', fn (string $email) => str($email)->is('[email protected]'))
->missing('password')
->etc()
)
);
#JSONコレクションのアサーションのスコープ指定
アプリケーションのルートが名前付きキーを持つ JSON コレクションを返すことがあります:
Route::get('/users', function () {
return [
'meta' => [...],
'users' => User::all(),
];
})
これらのルートをテストする際、has メソッドでコレクション内のアイテム数をアサートできます。さらに、has メソッドを使ってアサーションチェーンのスコープを指定することも可能です:
$response
->assertJson(fn (AssertableJson $json) =>
$json->has('meta')
->has('users', 3)
->has('users.0', fn (AssertableJson $json) =>
$json->where('id', 1)
->where('name', 'Victoria Faith')
->where('email', fn (string $email) => str($email)->is('[email protected]'))
->missing('password')
->etc()
)
);
ただし、users コレクションに対して2回 has メソッドを呼ぶ代わりに、3番目の引数にクロージャを渡す1回の呼び出しで済ませることもできます。この場合、クロージャは自動的に呼び出され、コレクションの最初のアイテムにスコープされます:
$response
->assertJson(fn (AssertableJson $json) =>
$json->has('meta')
->has('users', 3, fn (AssertableJson $json) =>
$json->where('id', 1)
->where('name', 'Victoria Faith')
->where('email', fn (string $email) => str($email)->is('[email protected]'))
->missing('password')
->etc()
)
);
#JSONの型のアサーション
JSONレスポンスのプロパティが特定の型であることだけをアサートしたい場合があります。Illuminate\Testing\Fluent\AssertableJson クラスはそのために whereType と whereAllType メソッドを提供します:
$response->assertJson(fn (AssertableJson $json) =>
$json->whereType('id', 'integer')
->whereAllType([
'users.0.name' => 'string',
'meta' => 'array'
])
);
whereType メソッドの第2引数に | で区切った複数の型や、型の配列を渡すこともできます。レスポンスの値がリストされた型のいずれかであればアサーションは成功します:
$response->assertJson(fn (AssertableJson $json) =>
$json->whereType('name', 'string|null')
->whereType('id', ['string', 'integer'])
);
whereType と whereAllType メソッドは次の型を認識します:string、integer、double、boolean、array、null。
#ファイルアップロードのテスト
Illuminate\Http\UploadedFile クラスは、テスト用のダミーファイルや画像を生成するための fake メソッドを提供します。これと Storage ファサードの fake メソッドを組み合わせることで、ファイルアップロードのテストが大幅に簡単になります。例えば、アバターアップロードフォームのテストを簡単に行えます:
<?php
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
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' => ['有効な名前を入力してください。']
])->view('form');
$view->assertSee('有効な名前を入力してください。');
#Blade とコンポーネントのレンダリング
必要に応じて、blade メソッドを使って生の Blade 文字列を評価・レンダリングできます。view メソッドと同様に、blade メソッドは Illuminate\Testing\TestView のインスタンスを返します:
$view = $this->blade(
'<x-component :name="$name" />',
['name' => 'Taylor']
);
$view->assertSee('Taylor');
component メソッドを使うと、Blade コンポーネントを評価・レンダリングできます。component メソッドは Illuminate\Testing\TestComponent のインスタンスを返します:
$view = $this->component(Profile::class, ['name' => 'Taylor']);
$view->assertSee('Taylor');
#利用可能なアサーション
#レスポンスのアサーション
Laravel の Illuminate\Testing\TestResponse クラスは、アプリケーションのテスト時に利用できるさまざまなカスタムアサーションメソッドを提供します。これらのアサーションは、json、get、post、put、delete のテストメソッドで返されるレスポンスで利用可能です:
assertAccepted assertBadRequest assertConflict assertCookie assertCookieExpired assertCookieNotExpired assertCookieMissing assertCreated assertDontSee assertDontSeeText assertDownload assertExactJson 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ステータスコードであることをアサートします:
$response->assertBadRequest();
#assertAccepted
レスポンスが受理済み(202)HTTPステータスコードであることをアサートします:
$response->assertAccepted();
#assertConflict
レスポンスが競合(409)HTTPステータスコードであることをアサートします:
$response->assertConflict();
#assertCookie
レスポンスに指定したクッキーが含まれていることをアサートします:
$response->assertCookie($cookieName, $value = null);
#assertCookieExpired
レスポンスに指定したクッキーが含まれており、かつ期限切れであることをアサートします:
$response->assertCookieExpired($cookieName);
#assertCookieNotExpired
レスポンスに指定したクッキーが含まれており、かつ期限切れでないことをアサートします:
$response->assertCookieNotExpired($cookieName);
#assertCookieMissing
レスポンスに指定したクッキーが含まれていないことをアサートします:
$response->assertCookieMissing($cookieName);
#assertCreated
レスポンスが201 HTTPステータスコードであることをアサートします:
$response->assertCreated();
#assertDontSee
レスポンスに指定した文字列が含まれていないことをアサートします。このアサーションは、第二引数にfalseを渡さない限り自動的に文字列をエスケープします:
$response->assertDontSee($value, $escaped = true);
#assertDontSeeText
レスポンスのテキストに指定した文字列が含まれていないことをアサートします。このアサーションは、第二引数にfalseを渡さない限り自動的に文字列をエスケープします。このメソッドはアサーション前にレスポンス内容をstrip_tags PHP関数に渡します:
$response->assertDontSeeText($value, $escaped = true);
#assertDownload
レスポンスが「ダウンロード」であることをアサートします。通常は、呼び出されたルートがResponse::downloadレスポンス、BinaryFileResponse、またはStorage::downloadレスポンスを返した場合を指します:
$response->assertDownload();
必要に応じて、ダウンロードされるファイルに指定したファイル名が割り当てられていることをアサートできます:
$response->assertDownload('image.jpg');
#assertExactJson
レスポンスが指定したJSONデータと完全に一致することをアサートします:
$response->assertExactJson(array $data);
#assertForbidden
レスポンスが禁止(403)HTTPステータスコードであることをアサートします:
$response->assertForbidden();
#assertFound
レスポンスが見つかった(302)HTTPステータスコードであることをアサートします:
$response->assertFound();
#assertGone
レスポンスが消失(410)HTTPステータスコードであることをアサートします:
$response->assertGone();
#assertHeader
レスポンスに指定したヘッダーと値が存在することをアサートします:
$response->assertHeader($headerName, $value = null);
#assertHeaderMissing
レスポンスに指定したヘッダーが存在しないことをアサートします:
$response->assertHeaderMissing($headerName);
#assertInternalServerError
レスポンスが「内部サーバーエラー」(500)HTTPステータスコードであることをアサートします:
$response->assertInternalServerError();
#assertJson
レスポンスに指定したJSONデータが含まれていることをアサートします:
$response->assertJson(array $data, $strict = false);
assertJsonメソッドはレスポンスを配列に変換し、PHPUnit::assertArraySubsetを使って指定した配列が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
レスポンスがメソッド不許可(405)HTTPステータスコードであることをアサートします:
$response->assertMethodNotAllowed();
#assertMovedPermanently
レスポンスが恒久的に移動(301)HTTPステータスコードであることをアサートします:
$response->assertMovedPermanently();
#assertLocation
レスポンスのLocationヘッダーに指定したURIが含まれていることをアサートします:
$response->assertLocation($uri);
#assertContent
レスポンスの内容が指定した文字列と一致することをアサートします:
$response->assertContent($value);
#assertNoContent
レスポンスが指定したHTTPステータスコードで、かつ内容が空であることをアサートします:
$response->assertNoContent($status = 204);
#assertStreamedContent
ストリームレスポンスの内容が指定した文字列と一致することをアサートします:
$response->assertStreamedContent($value);
#assertNotFound
レスポンスが見つからない(404)HTTPステータスコードであることをアサートします:
$response->assertNotFound();
#assertOk
レスポンスが200 HTTPステータスコードであることをアサートします:
$response->assertOk();
#assertPaymentRequired
レスポンスが支払いが必要(402)HTTPステータスコードであることをアサートします:
$response->assertPaymentRequired();
#assertPlainCookie
レスポンスに指定した暗号化されていないクッキーが含まれていることをアサートします:
$response->assertPlainCookie($cookieName, $value = null);
#assertRedirect
レスポンスが指定したURIへのリダイレクトであることをアサートします:
$response->assertRedirect($uri = null);
#assertRedirectContains
レスポンスが指定した文字列を含むURIへリダイレクトしているかをアサートします:
$response->assertRedirectContains($string);
#assertRedirectToRoute
レスポンスが指定したnamed routeへのリダイレクトであることをアサートします:
$response->assertRedirectToRoute($name, $parameters = []);
#assertRedirectToSignedRoute
レスポンスが指定されたsigned routeへのリダイレクトであることをアサートします:
$response->assertRedirectToSignedRoute($name = null, $parameters = []);
#assertRequestTimeout
レスポンスがリクエストタイムアウト(408)HTTPステータスコードであることをアサートします:
$response->assertRequestTimeout();
#assertSee
レスポンスに指定した文字列が含まれていることをアサートします。このアサーションは、第二引数にfalseを渡さない限り、自動的に文字列をエスケープします:
$response->assertSee($value, $escaped = true);
#assertSeeInOrder
レスポンスに指定した複数の文字列が順番通りに含まれていることをアサートします。このアサーションは、第二引数にfalseを渡さない限り、自動的に文字列をエスケープします:
$response->assertSeeInOrder(array $values, $escaped = true);
#assertSeeText
レスポンスのテキストに指定した文字列が含まれていることをアサートします。このアサーションは、第二引数にfalseを渡さない限り、自動的に文字列をエスケープします。アサーションの前にレスポンスの内容はPHPのstrip_tags関数に渡されます:
$response->assertSeeText($value, $escaped = true);
#assertSeeTextInOrder
レスポンスのテキストに指定した複数の文字列が順番通りに含まれていることをアサートします。このアサーションは、第二引数にfalseを渡さない限り、自動的に文字列をエスケープします。アサーションの前にレスポンスの内容はPHPのstrip_tags関数に渡されます:
$response->assertSeeTextInOrder(array $values, $escaped = true);
#assertServerError
レスポンスがサーバーエラー(500以上600未満)のHTTPステータスコードであることをアサートします:
$response->assertServerError();
#assertServiceUnavailable
レスポンスが「Service Unavailable」(503)のHTTPステータスコードであることをアサートします:
$response->assertServiceUnavailable();
#assertSessionHas
セッションに指定したデータが含まれていることをアサートします:
$response->assertSessionHas($key, $value = null);
必要に応じて、assertSessionHasメソッドの第二引数にクロージャを渡せます。クロージャがtrueを返せばアサーションは成功します:
$response->assertSessionHas($key, function (User $value) {
return $value->name === 'Taylor Otwell';
});
#assertSessionHasInput
セッションのフラッシュされた入力配列に指定した値が含まれていることをアサートします:
$response->assertSessionHasInput($key, $value = null);
必要に応じて、assertSessionHasInputメソッドの第二引数にクロージャを渡せます。クロージャが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
レスポンスが成功(200以上300未満)のHTTPステータスコードであることをアサートします:
$response->assertSuccessful();
#assertTooManyRequests
レスポンスがリクエスト過多(429)のHTTPステータスコードであることをアサートします:
$response->assertTooManyRequests();
#assertUnauthorized
レスポンスが認証されていない(401)のHTTPステータスコードであることをアサートします:
$response->assertUnauthorized();
#assertUnprocessable
レスポンスが処理できないエンティティ(422)のHTTPステータスコードであることをアサートします:
$response->assertUnprocessable();
#assertUnsupportedMediaType
レスポンスがサポートされていないメディアタイプ(415)のHTTPステータスコードであることをアサートします:
$response->assertUnsupportedMediaType();
#assertValid
指定したキーに対してバリデーションエラーがないことをアサートします。このメソッドは、バリデーションエラーがJSON形式で返されたレスポンスや、エラーがセッションにフラッシュされたレスポンスの両方に使えます:
// バリデーションエラーが存在しないことをアサート...
$response->assertValid();
// 指定したキーにバリデーションエラーがないことをアサート...
$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メソッドの第二引数にクロージャを渡すと、特定のビューのデータを検査してアサートできます:
$response->assertViewHas('user', function (User $user) {
return $user->name === 'Taylor';
});
さらに、レスポンスのビューのデータは配列のようにアクセスできるため、簡単に検査できます:
$this->assertEquals('Taylor', $response['name']);
#assertViewHasAll
レスポンスのビューに指定した複数のデータが含まれていることをアサートします:
$response->assertViewHasAll(array $data);
このメソッドは、ビューに指定したキーのデータが存在することをアサートするのに使えます:
$response->assertViewHasAll([
'name',
'email',
]);
または、ビューのデータが存在し、特定の値を持つことをアサートできます:
$response->assertViewHasAll([
'name' => 'Taylor Otwell',
'email' => '[email protected],',
]);
#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形式で返されたレスポンスや、エラーがセッションにフラッシュされたレスポンスの両方に使えます:
// バリデーションエラーが存在しないことをアサート...
$response->assertValid();
// 指定したキーにバリデーションエラーがないことをアサート...
$response->assertValid(['name', 'email']);
#assertInvalid
指定したキーに対してバリデーションエラーがあることをアサートします。このメソッドは、バリデーションエラーがJSON形式で返されたレスポンスや、エラーがセッションにフラッシュされたレスポンスの両方に使えます:
$response->assertInvalid(['name', 'email']);
特定のキーに対して特定のバリデーションエラーメッセージがあることもアサートできます。その際、メッセージ全体または一部だけを指定できます:
$response->assertInvalid([
'name' => 'The name field is required.',
'email' => 'valid email address',
]);