コンテンツにスキップ

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 構造などを検査するためさまざまなアサーションも含まれています。

リクエストの作成

アプリケーションにリクエストを行うには、テスト内で getpostputpatch、または 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 つのリクエストのみを行う必要があります。単一のテストメソッド内で複数のリクエストが実行されると、予期しない動作が発生する可能性があります。

lightbulb

便宜上、テストの実行中は 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')

レスポンスのデバッグ

アプリケーションにテストリクエストを行った後、dumpdumpHeaders、および 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();
}
}

代わりに、ddddHeaders、および 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 とそのレスポンスをテストするためのいくつかのヘルパーも提供します。たとえば、jsongetJsonpostJsonputJsonpatchJsondeleteJson、および optionsJson メソッドを使用して、さまざまな HTTP 動詞で JSON リクエストを発行できます。また、これらのメソッドにデータとヘッダーを簡単に渡すこともできます。始めるには、/api/userPOST リクエストを作成し、予期される 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']);
lightbulb

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')
->where('email', fn (string $email) => str($email)->is('[email protected]'))
->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')
->where('email', fn (string $email) => str($email)->is('[email protected]'))
->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')
->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コレクションに対してアサーションを実行するために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')
->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メソッドは、次のタイプを認識します:stringintegerdoublebooleanarray、および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クラスは、次のアサーションメソッドを提供します:assertSeeassertSeeInOrderassertSeeTextassertSeeTextInOrderassertDontSee、および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クラスは、アプリケーションのテスト時に利用できるさまざまなカスタムアサーションメソッドを提供します。これらのアサーションは、jsongetpostput、およびdeleteテストメソッドによって返されるレスポンスでアクセスできます.

(アサーションメソッドのリスト 省略)

assertBadRequest

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

$response->assertBadRequest();

assertAccepted

レスポンスに受け入れられた(202)HTTPステータスコードがあることをアサートします。

$response->assertAccepted();

assertConflict

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

$response->assertConflict();

レスポンスに指定されたCookieが含まれていることをアサートします。

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

レスポンスに指定されたCookieが含まれており、期限切れであることをアサートします。

$response->assertCookieExpired($cookieName);

レスポンスに指定されたCookieが含まれており、期限切れでないことをアサートします。

$response->assertCookieNotExpired($cookieName);

レスポンスに指定された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);
lightbulb

より汎用的な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');
lightbulb

より汎用的な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();

レスポンスに、指定された暗号化されていない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.'
]);
lightbulb

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

assertSessionHasErrorsIn

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

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

assertSessionHasNoErrors

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

$response->assertSessionHasNoErrors();

assertSessionDoesntHaveErrors

セッションに、指定されたキーの検証エラーがないことをアサートします。

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

より汎用的な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',
'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構造として返されるレスポンス、または検証エラーがセッションにフラッシュされたレスポンスに対してアサートする場合に使用できます。

// 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',
]);