- はじめに
- JSON APIのテスト
- 流暢なJSONテスト
- ファイルアップロードのテスト
- ビューのテスト
- Bladeとコンポーネントのレンダリング
- 利用可能な主張
- レスポンスの主張
- assertBadRequest
- assertAccepted
- assertConflict
- assertCookie
- assertCookieExpired
- assertCookieNotExpired
- assertCookieMissing
- assertCreated
- assertDontSee
- assertDontSeeText
- assertDownload
- assertExactJson
- assertExactJsonStructure
- assertForbidden
- assertFound
- assertGone
- assertHeader
- assertHeaderMissing
- assertInternalServerError
- assertJson
- assertJsonFragment
- assertJsonIsArray
- assertJsonIsObject
- assertJsonMissing
- assertJsonMissingExact
- assertJsonMissingValidationErrors
- assertJsonPath
- assertJsonMissingPath
- assertJsonStructure
- assertJsonValidationErrors
- assertJsonValidationErrorFor
- assertMethodNotAllowed
- assertMovedPermanently
- assertLocation
- 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
- Authentication Assertions
- レスポンスの主張
- Validation Assertions
はじめに
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);
}
}
<a name="making-requests"></a>
## リクエストの作成
アプリケーションにリクエストを作成するには、テスト内で`````get`````、`````post`````、`````put`````、`````patch`````、または`````delete`````メソッドを呼び出すことができます。これらのメソッドは、実際にアプリケーションに対して「本物の」HTTPリクエストを発行するわけではありません。代わりに、ネットワークリクエスト全体が内部でシミュレートされます。
`````Illuminate\Http\Response`````インスタンスを返す代わりに、テストリクエストメソッドは`````Illuminate\Testing\TestResponse`````のインスタンスを返し、アプリケーションのレスポンスを検査するための[さまざまな便利な主張](#available-assertions)を提供します:
``````php
<?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);
}
}
クッキー
リクエストを行う前にクッキーの値を設定するには、withCookie
またはwithCookies
メソッドを使用できます。withCookie
メソッドは、クッキー名と値を2つの引数として受け取り、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.';
});
}
}
``````php
Exceptions::assertNotReported(InvalidOrderException::class);
Exceptions::assertNothingReported();
`
リクエストを行う前にwithoutExceptionHandling
メソッドを呼び出すことで、特定のリクエストに対する例外処理を完全に無効にすることができます:
$response = $this->withoutExceptionHandling()->get('/');
さらに、アプリケーションがPHP言語やアプリケーションが使用しているライブラリによって非推奨とされた機能を利用していないことを確認したい場合は、リクエストを行う前にwithoutDeprecationHandling
メソッドを呼び出すことができます。非推奨処理が無効になっている場合、非推奨警告は例外に変換され、テストが失敗します:
$response = $this->withoutDeprecationHandling()->get('/');
``````php
$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リクエストを発行できます。これらのメソッドにデータやヘッダーを簡単に渡すこともできます。始めるために、POST
リクエストを/api/user
に対して行い、期待される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']);
<a name="verifying-exact-match"></a>
#### 正確なJSONマッチの主張
前述のように、`````assertJson`````メソッドを使用して、JSONのフラグメントがJSONレスポンス内に存在することを主張できます。アプリケーションによって返されたJSONが特定の配列と**正確に一致する**ことを確認したい場合は、`````assertExactJson`````メソッドを使用する必要があります:
``````php
<?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');
}
}
``````php
$response->assertJsonPath('team.owner.name', fn (string $name) => strlen($name) >= 3);
`
流暢なJSONテスト
Laravelは、アプリケーションのJSONレスポンスを流暢にテストするための美しい方法も提供します。始めるには、assertJson
メソッドにクロージャを渡します。このクロージャは、アプリケーションによって返されたJSONに対して主張を行うために使用できるIlluminate\Testing\Fluent\AssertableJson
のインスタンスで呼び出されます。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(''))
->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(''))
->whereNot('status', 'pending')
->missing('password')
->etc()
);
}
etcメソッドの理解
上記の例では、主張チェーンの最後にetc
メソッドを呼び出したことに気付いたかもしれません。このメソッドは、LaravelにJSONオブジェクトに他の属性が存在する可能性があることを通知します。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'])
);
``````php
$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
メソッドは、最初の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(''))
->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(''))
->missing('password')
->etc()
)
);
ただし、users
コレクションに対してhas
メソッドを2回別々に呼び出すのではなく、3番目のパラメータとしてクロージャを提供する単一の呼び出しを行うことができます。この場合、クロージャは自動的に呼び出され、コレクション内の最初のアイテムにスコープされます:
$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(''))
->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'
])
);
``````php
$response->assertJson(fn (AssertableJson $json) =>
$json->whereType('name', 'string|null')
->whereType('id', ['string', 'integer'])
);
`
whereType
およびwhereAllType
メソッドは、次のタイプを認識します: string
、integer
、double
、boolean
、array
、およびnull
。
ファイルアップロードのテスト
``````php
<?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');
ファイルのカスタマイズ
``````php
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');
``````php
$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 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ステータスコードを持つことを主張します:
$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
の2番目の引数を渡さない限り、指定された文字列を自動的にエスケープします:
$response->assertDontSee($value, $escaped = true);
assertDontSeeText
指定された文字列がレスポンステキストに含まれていないことを主張します。この主張は、false
の2番目の引数を渡さない限り、指定された文字列を自動的にエスケープします。このメソッドは、主張を行う前にレスポンスコンテンツを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);
assertExactJsonStructure
レスポンスが指定されたJSON構造の正確な一致を含むことを主張します:
$response->assertExactJsonStructure(array $data);
このメソッドは、assertJsonStructureのより厳密なバリアントです。assertJsonStructure
と対照的に、このメソッドは、レスポンスに期待されるJSON構造に明示的に含まれていないキーが含まれている場合に失敗します。
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);
<a name="assert-json-count"></a>
#### assertJsonCount
レスポンスJSONが指定されたキーに期待される数のアイテムを持つ配列であることを主張します:
``````php
$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"
}
}
``````php
$response->assertJsonPath('user.name', 'Steve Schoger');
`
assertJsonMissingPath
レスポンスが指定されたパスを含まないことを主張します:
$response->assertJsonMissingPath($path);
例えば、アプリケーションによって返された次のJSONレスポンスがある場合:
{
"user": {
"name": "Steve Schoger"
}
}
``````php
$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
の2番目の引数を渡さない限り、指定された文字列を自動的にエスケープします:
$response->assertSee($value, $escaped = true);
assertSeeInOrder
指定された文字列がレスポンスに順番に含まれていることを確認します。このアサーションは、false
の2番目の引数を渡さない限り、指定された文字列を自動的にエスケープします:
$response->assertSeeInOrder(array $values, $escaped = true);
assertSeeText
指定された文字列がレスポンステキストに含まれていることを確認します。このアサーションは、false
の2番目の引数を渡さない限り、指定された文字列を自動的にエスケープします。レスポンスコンテンツは、アサーションが行われる前にstrip_tags
PHP 関数に渡されます:
$response->assertSeeText($value, $escaped = true);
assertSeeTextInOrder
指定された文字列がレスポンステキストに順番に含まれていることを確認します。このアサーションは、false
の2番目の引数を渡さない限り、指定された文字列を自動的にエスケープします。レスポンスコンテンツは、アサーションが行われる前にstrip_tags
PHP 関数に渡されます:
$response->assertSeeTextInOrder(array $values, $escaped = true);
assertServerError
レスポンスがサーバーエラー (>= 500 , < 600) HTTP ステータスコードを持つことを確認します:
$response->assertServerError();
assertServiceUnavailable
レスポンスが「サービス利用不可」 (503) HTTP ステータスコードを持つことを確認します:
$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
が連想配列の場合、セッションが各フィールド (キー) に対して特定のエラーメッセージ (値) を含んでいることをアサートします。このメソッドは、バリデーションエラーをセッションにフラッシュするルートをテストする際に使用する必要があります:
$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構造として返されるレスポンスや、バリデーションエラーがセッションにフラッシュされるレスポンスに対してアサートするために使用できます:
// 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' => ',',
]);
assertViewIs
指定されたビューがルートによって返されたことを確認します:
$response->assertViewIs($value);
assertViewMissing
指定されたデータキーがアプリケーションのレスポンスで返されたビューに利用可能でないことを確認します:
$response->assertViewMissing($key);
Authentication Assertions
Laravelは、アプリケーションの機能テスト内で利用できるさまざまな認証関連のアサーションを提供します。これらのメソッドは、Illuminate\Testing\TestResponse
やget
、post
などのメソッドによって返されるインスタンスではなく、テストクラス自体で呼び出されることに注意してください。
assertAuthenticated
ユーザーが認証されていることを確認します:
$this->assertAuthenticated($guard = null);
assertGuest
ユーザーが認証されていないことを確認します:
$this->assertGuest($guard = null);
assertAuthenticatedAs
特定のユーザーが認証されていることを確認します:
$this->assertAuthenticatedAs($user, $guard = null);
Validation Assertions
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',
]);