イントロダクション
Laravelはアプリケーションに対するHTTPリクエストを作成し、出力を検査するためのとても記述的なAPIを用意しています。例として、以下のテストをご覧ください。
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
class ExampleTest extends TestCase
{
/**
* 基本的な機能テストの例
*
* @return void
*/
public function testBasicTest()
{
$response = $this->get('/');
$response->assertStatus(200);
}
}
get
メソッドはアプリケーションに対して、GET
リクエストを作成します。assertStatus
メソッドは返されたレスポンスが指定したHTTPステータスコードを持っていることをアサートします。このシンプルな例に加え、レスポンスヘッダ、コンテンツ、JSON構造などを検査する様々なアサートをLaravelは用意しています。
リクエストヘッダのカスタマイズ
アプリーケーションへ送り返す前に、リクエストヘッダをカスタマイズするには、withHeaders
メソッドを使います。これにより任意のカスタムヘッダをリクエストに追加することができます。
<?php
class ExampleTest extends TestCase
{
/**
* 基本的な機能テストの例
*
* @return void
*/
public function testBasicExample()
{
$response = $this->withHeaders([
'X-Header' => 'Value',
])->json('POST', '/user', ['name' => 'Sally']);
$response
->assertStatus(201)
->assertJson([
'created' => true,
]);
}
}
Tip!! テスト実行時、CSRFミドルウェアは自動的に無効になります。
レスポンスのデバッグ
アプリケーションへ送るテストリクエストを作成し終えたら、レスポンスの内容を確認し、デバッグするためにdump
とdumpHeaders
メソッドが使用できます。
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
class ExampleTest extends TestCase
{
/**
* 基本的なテスト例
*
* @return void
*/
public function testBasicTest()
{
$response = $this->get('/');
$response->dumpHeaders();
$response->dump();
}
}
セッション/認証
Laravelはテスト時にセッションを操作するたくさんのヘルパも提供しています。1つ目は指定した配列をセッションに保存するwithSession
メソッドです。これはアプリケーションのリクエストをテストする前に、データをセッションにロードしたい場合に便利です。
<?php
class ExampleTest extends TestCase
{
public function testApplication()
{
$response = $this->withSession(['foo' => 'bar'])
->get('/');
}
}
認証済みのユーザーのようなユーザー状態をセッションへ保持するのは一般的です。actingAs
ヘルパメソッドは現在認証済みのユーザーを指定する簡単な手段を提供します。例として、モデルファクトリでユーザーを生成し、認証してみましょう。
<?php
use App\User;
class ExampleTest extends TestCase
{
public function testApplication()
{
$user = factory(User::class)->create();
$response = $this->actingAs($user)
->withSession(['foo' => 'bar'])
->get('/');
}
}
ユーザーの認証にどのガードを使用するかを指定したい場合、actingAs
メソッドの第2引数にガード名を渡します。
$this->actingAs($user, 'api')
JSON APIのテスト
LaravelはJSON
APIとレスポンスをテストする数多くのヘルパを用意しています。たとえば、json
、get
、post
、put
、patch
、delete
、option
メソッドはそれぞれのHTTP動詞のリクエストを発生させるために使用します。これらのメソッドには簡単にデータやヘッダを渡せます。手始めに、/user
に対するPOST
リクエストを作成し、期待したデータが返されることをアサートするテストを書いてみましょう。
<?php
class ExampleTest extends TestCase
{
/**
* 基本的な機能テストの例
*
* @return void
*/
public function testBasicExample()
{
$response = $this->json('POST', '/user', ['name' => 'Sally']);
$response
->assertStatus(201)
->assertJson([
'created' => true,
]);
}
}
Tip!! The
assertJson
メソッドはレスポンスを配列へ変換し、PHPUnit::assertArraySubset
を使用しアプリケーションへ戻ってきたJSONレスポンスの中に、指定された配列が含まれているかを確認します。そのため、JSONレスポンスの中に他のプロパティが存在していても、このテストは指定した一部が残っている限り、テストはパスし続けます。
JSONとの完全一致を検証
アプリケーションから返されるJSONが、指定した配列と完全に一致することを検証したい場合は、assertExactJson
メソッドを使用します。
<?php
class ExampleTest extends TestCase
{
/**
* 基本的な機能テストの例
*
* @return void
*/
public function testBasicExample()
{
$response = $this->json('POST', '/user', ['name' => 'Sally']);
$response
->assertStatus(201)
->assertExactJson([
'created' => true,
]);
}
}
ファイルアップロードのテスト
Illuminate\Http\UploadedFile
クラスは、テストのためにファイルやイメージのダミーを生成するためのfake
メソッドを用意しています。これをStorage
ファサードのfake
メソッドと組み合わせることで、ファイルアップロードのテストがとてもシンプルになります。例として、2つの機能を組み合わせて、アバターのアップロードをテストしてみましょう。
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
class ExampleTest extends TestCase
{
public function testAvatarUpload()
{
Storage::fake('avatars');
$file = UploadedFile::fake()->image('avatar.jpg');
$response = $this->json('POST', '/avatar', [
'avatar' => $file,
]);
// ファイルが保存されたことをアサートする
Storage::disk('avatars')->assertExists($file->hashName());
// ファイルが存在しないことをアサートする
Storage::disk('avatars')->assertMissing('missing.jpg');
}
}
ダミーファイルのカスタマイズ
fake
メソッドでファイルを生成するときには、バリデーションルールをより便利にテストできるように、画像の幅、高さ、サイズを指定できます。
UploadedFile::fake()->image('avatar.jpg', $width, $height)->size(100);
画像の生成に付け加え、create
メソッドで他のタイプのファイルも生成できます。
UploadedFile::fake()->create('document.pdf', $sizeInKilobytes);
利用可能なアサート
レスポンスのアサート
PHPUnitテスト用に、数多くの追加アサートメソッドをLaravelは提供しています。以下のアサートで、json
、get
、post
、put
、delete
テストメソッドから返されたレスポンスへアクセスしてください。
assertCookie
レスポンスが指定したクッキーを持っていることを宣言。
$response->assertCookie($cookieName, $value = null);
assertCookieExpired
レスポンスが指定したクッキーを持っており、期限切れであることを宣言。
$response->assertCookieExpired($cookieName);
assertCookieNotExpired
レスポンスが指定したクッキーを持っており、期限切れでないことを宣言。
$response->assertCookieNotExpired($cookieName);
assertCookieMissing
レスポンスが指定したクッキーを持っていないことを宣言。
$response->assertCookieMissing($cookieName);
assertDontSee
指定した文字列がレスポンスに含まれていないことを宣言。
$response->assertDontSee($value);
assertDontSeeText
指定した文字列がレスポンステキストに含まれていないことを宣言。
$response->assertDontSeeText($value);
assertExactJson
レスポンスが指定したJSONデータと完全に一致するデータを持っていることを宣言。
$response->assertExactJson(array $data);
assertForbidden
レスポンスがforbiddenステータスコードを持っていることを宣言。
$response->assertForbidden();
assertHeader
レスポンスに指定したヘッダが存在していることを宣言。
$response->assertHeader($headerName, $value = null);
assertHeaderMissing
レスポンスに指定したヘッダが存在していないことを宣言。
$response->assertHeaderMissing($headerName);
assertJson
レスポンスが指定したJSONデータを持っていることを宣言。
$response->assertJson(array $data);
assertJsonCount
レスポンスJSONが、指定したキーのアイテムを、期待値分持っていることを宣言。
$response->assertJsonCount($count, $key = null);
assertJsonFragment
レスポンスが指定したJSONの一部を含んでいることを宣言。
$response->assertJsonFragment(array $data);
assertJsonMissing
レスポンスが指定したJSONの一部を含んでいないことを宣言。
$response->assertJsonMissing(array $data);
assertJsonMissingExact
レスポンスがJSONの一部をそのまま含んでいないことを宣言。
$response->assertJsonMissingExact(array $data);
assertJsonMissingValidationErrors
レスポンスが指定したキーに対するJSONバリデーションエラーを含んていないことを宣言。
$response->assertJsonMissingValidationErrors($keys);
assertJsonStructure
レスポンスが指定したJSONの構造を持っていることを宣言。
$response->assertJsonStructure(array $structure);
assertJsonValidationErrors
レスポンスが指定したJSONバリデーションエラーを持っていることを宣言。
$response->assertJsonValidationErrors(array $data);
assertLocation
レスポンスのLocation
ヘッダが、指定したURIを持つことを宣言。
$response->assertLocation($uri);
assertNotFound
レスポンスがnot foundのステータスコードを持っていることを宣言。
$response->assertNotFound();
assertOk
レスポンスが200のステータスコードを持っていることを宣言。
$response->assertOk();
assertPlainCookie
レスポンスが指定した暗号化されていないクッキーを持っていることを宣言。
$response->assertPlainCookie($cookieName, $value = null);
assertRedirect
クライアントが指定したURIへリダイレクトすることを宣言。
$response->assertRedirect($uri);
assertSee
指定した文字列がレスポンスに含まれていることを宣言。
$response->assertSee($value);
assertSeeInOrder
指定した文字列が、順番通りにレスポンスに含まれていることを宣言。
$response->assertSeeInOrder(array $values);
assertSeeText
指定した文字列がレスポンステキストに含まれていることを宣言。
$response->assertSeeText($value);
assertSeeTextInOrder
指定した文字列が、順番通りにレンスポンステキストへ含まれていることを宣言。
$response->assertSeeTextInOrder(array $values);
assertSessionHas
セッションが指定したデータを持っていることを宣言。
$response->assertSessionHas($key, $value = null);
assertSessionHasInput
そのセッションが指定値をフラッシュデータの入力配列中に持っていることを宣言。
$response->assertSessionHasInput($key, $value = null);
assertSessionHasAll
セッションが指定したリストの値を持っていることを宣言。
$response->assertSessionHasAll(array $data);
assertSessionHasErrors
セッションが指定したフィールドに対するエラーを含んでいることを宣言。
$response->assertSessionHasErrors(array $keys, $format = null, $errorBag = 'default');
assertSessionHasErrorsIn
セッションが指定したエラーを持っていることを宣言。
$response->assertSessionHasErrorsIn($errorBag, $keys = [], $format = null);
assertSessionHasNoErrors
セッションがエラーを持っていないことを宣言。
$response->assertSessionHasNoErrors();
assertSessionDoesntHaveErrors
セッションが、指定したキーに対するエラーを持っていないことを宣言。
$response->assertSessionDoesntHaveErrors($keys = [], $format = null, $errorBag = 'default');
assertSessionMissing
セッションが指定したキーを持っていないことを宣言。
$response->assertSessionMissing($key);
assertStatus
クライアントのレスポンスが指定したコードであることを宣言。
$response->assertStatus($code);
assertSuccessful
レスポンスが成功(200)ステータスコードであることを宣言。
$response->assertSuccessful();
assertUnauthorized
レスポンスがオーソライズされていない(401)ステータスコードであることを宣言。
$response->assertUnauthorized();
assertViewHas
レスポンスビューが指定したデータを持っていることを宣言。
$response->assertViewHas($key, $value = null);
assertViewHasAll
レスポンスビューが指定したリストのデータを持っていることを宣言。
$response->assertViewHasAll(array $data);
assertViewIs
ルートにより、指定したビューが返されたことを宣言。
$response->assertViewIs($value);
assertViewMissing
レスポンスビューが指定したデータを持っていないことを宣言。
$response->assertViewMissing($key);
認証のアサート
Laravelは、PHPUnitテストのために認証関連の様々なアサーションも提供しています。
メソッド | 説明 |
---|---|
$this->assertAuthenticated($guard = null); |
ユーザーが認証されていることを宣言。 |
$this->assertGuest($guard = null); |
ユーザーが認証されていないことを宣言。 |
$this->assertAuthenticatedAs($user, $guard = null); |
指定したユーザーが認証されていることを宣言。 |
$this->assertCredentials(array $credentials, $guard = null); |
指定した認証情報が有効であることを宣言。 |
$this->assertInvalidCredentials(array $credentials, $guard = null); |
指定した認証情報が無効であることを宣言。 |