イントロダクションIntroduction
Laravelはアプリケーションに対するHTTPリクエストを作成し、出力を検査するためのとても記述的なAPIを用意しています。例として、以下のテストをご覧ください。Laravel provides a very fluent API for making HTTP requests to your application and examining the output. For example, take a look at the test defined below:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;
class ExampleTest extends TestCase
{
/**
* 基本的な機能テストの例
*
* @return void
*/
public function testBasicTest()
{
$response = $this->get('/');
$response->assertStatus(200);
}
}
get
メソッドはアプリケーションに対して、GET
リクエストを作成します。assertStatus
メソッドは返されたレスポンスが指定したHTTPステータスコードを持っていることをアサートします。このシンプルな例に加え、レスポンスヘッダ、コンテンツ、JSON構造などを検査する様々なアサートをLaravelは用意しています。The get
method makes a GET
request into the application, while the assertStatus
method asserts that the returned response should have the given HTTP status code. In addition to this simple assertion, Laravel also contains a variety of assertions for inspecting the response headers, content, JSON structure, and more.
セッション/認証Session / Authentication
Laravelはテスト時にセッションを操作するたくさんのヘルパも提供しています。1つ目は指定した配列をセッションに保存するwithSession
メソッドです。これはアプリケーションのリクエストをテストする前に、データをセッションにロードしたい場合に便利です。Laravel provides several helpers for working with the session during HTTP testing. First, you may set the session data to a given array using the withSession
method. This is useful for loading the session with data before issuing a request to your application:
<?php
class ExampleTest extends TestCase
{
public function testApplication()
{
$response = $this->withSession(['foo' => 'bar'])
->get('/');
}
}
もちろん認証済みのユーザーのようなユーザー状態をセッションへ保持するのは一般的です。actingAs
ヘルパメソッドは現在認証済みのユーザーを指定する簡単な手段を提供します。例として、モデルファクトリでユーザーを生成し、認証してみましょう。Of course, one common use of the session is for maintaining state for the authenticated user. The actingAs
helper method provides a simple way to authenticate a given user as the current user. For example, we may use a model factory[/docs/{{version}}/database-testing#writing-factories] to generate and authenticate a user:
<?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引数にガード名を渡します。You may also specify which guard should be used to authenticate the given user by passing the guard name as the second argument to the actingAs
method:
$this->actingAs($user, 'api')
JSON APIのテストTesting JSON APIs
LaravelはJSON APIとレスポンスをテストする数多くのヘルパを用意しています。たとえば、json
、get
、post
、put
、patch
、delete
メソッドはそれぞれのHTTP動詞のリクエストを発生させるために使用します。これらのメソッドには簡単にデータやヘッダを渡せます。手始めに、/user
に対するPOST
リクエストを作成し、期待したデータが返されることをアサートするテストを書いてみましょう。Laravel also provides several helpers for testing JSON APIs and their responses. For example, the json
, get
, post
, put
, patch
, and delete
methods may be used to issue requests with various HTTP verbs. You may also easily pass data and headers to these methods. To get started, let's write a test to make a POST
request to /user
and assert that the expected data was returned:
<?php
class ExampleTest extends TestCase
{
/**
* 基本的な機能テスト例
*
* @return void
*/
public function testBasicExample()
{
$response = $this->json('POST', '/user', ['name' => 'Sally']);
$response
->assertStatus(200)
->assertJson([
'created' => true,
]);
}
}
">Tip!! The
assertJson
メソッドはレスポンスを配列へ変換し、PHPUnit::assertArraySubset
を使用しアプリケーションへ戻ってきたJSONレスポンスの中に、指定された配列が含まれているかを確認します。そのため、JSONレスポンスの中に他のプロパティが存在していても、このテストは指定した一部が残っている限り、テストはパスし続けます。{tip} TheassertJson
method converts the response to an array and utilizesPHPUnit::assertArraySubset
to verify that the given array exists within the JSON response returned by the application. So, if there are other properties in the JSON response, this test will still pass as long as the given fragment is present.
完全一致の検査Verifying Exact Match
アプリケーションから返されるJSONが、指定した配列と完全に一致することを検査したい場合は、assertExactJson
メソッドを使用します。If you would like to verify that the given array is an exact match for the JSON returned by the application, you should use the assertExactJson
method:
<?php
class ExampleTest extends TestCase
{
/**
* 基本的な機能テスト例
*
* @return void
*/
public function testBasicExample()
{
$response = $this->json('POST', '/user', ['name' => 'Sally']);
$response
->assertStatus(200)
->assertExactJson([
'created' => true,
]);
}
}
ファイルアップロードのテストTesting File Uploads
Illuminate\Http\UploadedFile
クラスは、テストのためにファイルやイメージのダミーを生成するためのfake
メソッドを用意しています。これをStorage
ファサードのfake
メソッドと組み合わせることで、ファイルアップロードのテストがとてもシンプルになります。例として、2つの機能を組み合わせて、アバターのアップロードをテストしてみましょう。The Illuminate\Http\UploadedFile
class provides a fake
method which may be used to generate dummy files or images for testing. This, combined with the Storage
facade's fake
method greatly simplifies the testing of file uploads. For example, you may combine these two features to easily test an avatar upload form:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;
class ExampleTest extends TestCase
{
public function testAvatarUpload()
{
Storage::fake('avatars');
$response = $this->json('POST', '/avatar', [
'avatar' => UploadedFile::fake()->image('avatar.jpg')
]);
// ファイルが保存されたことをアサートする
Storage::disk('avatars')->assertExists('avatar.jpg');
// ファイルが存在しないことをアサートする
Storage::disk('avatars')->assertMissing('missing.jpg');
}
}
ダミーファイルのカスタマイズFake File Customization
fake
メソッドでファイルを生成するときには、バリデーションルールをより便利にテストできるように、画像の幅、高さ、サイズを指定できます。When creating files using the fake
method, you may specify the width, height, and size of the image in order to better test your validation rules:
UploadedFile::fake()->image('avatar.jpg', $width, $height)->size(100);
画像の生成に付け加え、create
メソッドで他のタイプのファイルも生成できます。In addition to creating images, you may create files of any other type using the create
method:
UploadedFile::fake()->create('document.pdf', $sizeInKilobytes);
利用可能なアサートAvailable Assertions
PHPUnitテスト用に、数多くの追加アサートメソッドをLaravelは提供しています。以下のアサートで、json
、get
、post
、put
、delete
テストメソッドから返されたレスポンスへアクセスしてください。Laravel provides a variety of custom assertion methods for your PHPUnit[https://phpunit.de/] tests. These assertions may be accessed on the response that is returned from the json
, get
, post
, put
, and delete
test methods:
メソッドMethod | 説明Description |
---|---|
$response->assertStatus($code); $response->assertStatus($code); |
クライアントのレスポンスが指定したコードであることをアサート。Assert that the response has a given code. |
$response->assertRedirect($uri); $response->assertRedirect($uri); |
クライアントが指定したURIへリダイレクトすることをアサート。Assert that the response is a redirect to a given URI. |
$response->assertHeader($headerName, $value = null); $response->assertHeader($headerName, $value = null); |
レスポンスに指定したヘッダが存在していることをアサート。Assert that the given header is present on the response. |
$response->assertCookie($cookieName, $value = null); $response->assertCookie($cookieName, $value = null); |
レスポンスが指定したクッキーを持っていることをアサート。Assert that the response contains the given cookie. |
$response->assertPlainCookie($cookieName, $value = null); $response->assertPlainCookie($cookieName, $value = null); |
レスポンスが指定した暗号化されていないクッキーを持っていることをアサート。Assert that the response contains the given cookie (unencrypted). |
$response->assertSessionHas($key, $value = null); $response->assertSessionHas($key, $value = null); |
セッションが指定したデータを持っていることをアサート。Assert that the session contains the given piece of data. |
$response->assertSessionHasErrors(array $keys); $response->assertSessionHasErrors(array $keys); |
セッションが指定したフィールドのエラーを含んでいることをアサート。Assert that the session contains an error for the given field. |
$response->assertSessionMissing($key); $response->assertSessionMissing($key); |
セッションが指定したキーを持っていないことをアサート。Assert that the session does not contain the given key. |
$response->assertJson(array $data); $response->assertJson(array $data); |
レスポンスが指定したJSONデータを持っていることをアサート。Assert that the response contains the given JSON data. |
$response->assertJsonFragment(array $data); $response->assertJsonFragment(array $data); |
レスポンスが指定したJSONの一部を含んでいることをアサート。Assert that the response contains the given JSON fragment. |
$response->assertJsonMissing(array $data); $response->assertJsonMissing(array $data); |
レスポンスが指定したJSONの一部を含んでいないことをアサート。Assert that the response does not contain the given JSON fragment. |
$response->assertExactJson(array $data); $response->assertExactJson(array $data); |
レスポンスが指定したJSONデータと完全に一致するデータを持っていることをアサート。Assert that the response contains an exact match of the given JSON data. |
$response->assertJsonStructure(array $structure); $response->assertJsonStructure(array $structure); |
レスポンスが指定したJSONの構造を持っていることをアサート。Assert that the response has a given JSON structure. |
$response->assertViewIs($value); $response->assertViewIs($value); |
ルートにより、指定したビューが返されたことをアサート。Assert that the given view was returned by the route. |
$response->assertViewHas($key, $value = null); $response->assertViewHas($key, $value = null); |
レスポンスビューが指定したデータを持っていることをアサート。Assert that the response view was given a piece of data. |