Laravel5.5 LTS 日本語ドキュメント

このリポジトリはPHP Webアプリフレームワークである、LaravelのLTSバージョンである5.5の公式英文ドキュメントを日本語へ翻訳しています。

This project is maintained by okinaka

HTTPテスト

イントロダクション

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(200)
            ->assertJson([
                'created' => true,
            ]);
    }
}

セッション/認証

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とレスポンスをテストする数多くのヘルパを用意しています。たとえば、jsongetpostputpatchdeleteメソッドはそれぞれのHTTP動詞のリクエストを発生させるために使用します。これらのメソッドには簡単にデータやヘッダを渡せます。手始めに、/userに対するPOSTリクエストを作成し、期待したデータが返されることをアサートするテストを書いてみましょう。

<?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レスポンスの中に他のプロパティが存在していても、このテストは指定した一部が残っている限り、テストはパスし続けます。

JSONとの完全一致を検証

アプリケーションから返されるJSONが、指定した配列と完全に一致することを検証したい場合は、assertExactJsonメソッドを使用します。

<?php

class ExampleTest extends TestCase
{
    /**
     * 基本的な機能テスト例
     *
     * @return void
     */
    public function testBasicExample()
    {
        $response = $this->json('POST', '/user', ['name' => 'Sally']);

        $response
            ->assertStatus(200)
            ->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');

        $response = $this->json('POST', '/avatar', [
            'avatar' => UploadedFile::fake()->image('avatar.jpg')
        ]);

        // ファイルが保存されたことをアサートする
        Storage::disk('avatars')->assertExists('avatar.jpg');

        // ファイルが存在しないことをアサートする
        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は提供しています。以下のアサートで、jsongetpostputdeleteテストメソッドから返されたレスポンスへアクセスしてください。

メソッド 説明
$response->assertSuccessful(); レスポンスが成功のステータスコードであることをアサート。
$response->assertStatus($code); クライアントのレスポンスが指定したコードであることをアサート。
$response->assertRedirect($uri); クライアントが指定したURIへリダイレクトすることをアサート。
$response->assertHeader($headerName, $value = null); レスポンスに指定したヘッダが存在していることをアサート。
$response->assertCookie($cookieName, $value = null); レスポンスが指定したクッキーを持っていることをアサート。
$response->assertPlainCookie($cookieName, $value = null); レスポンスが指定した暗号化されていないクッキーを持っていることをアサート。
$response->assertCookieExpired($cookieName); レスポンスが指定したクッキーを持っており、期限切れであることをアサート。
$response->assertCookieMissing($cookieName); レスポンスが指定したクッキーを持っていないことをアサート。
$response->assertSessionHas($key, $value = null); セッションが指定したデータを持っていることをアサート。
$response->assertSessionHasErrors(array $keys, $format = null, $errorBag = 'default'); セッションが指定したフィールドに対するエラーを含んでいることをアサート。
$response->assertSessionMissing($key); セッションが指定したキーを持っていないことをアサート。
$response->assertJson(array $data); レスポンスが指定したJSONデータを持っていることをアサート。
$response->assertJsonFragment(array $data); レスポンスが指定したJSONの一部を含んでいることをアサート。
$response->assertJsonMissing(array $data); レスポンスが指定したJSONの一部を含んでいないことをアサート。
$response->assertExactJson(array $data); レスポンスが指定したJSONデータと完全に一致するデータを持っていることをアサート。
$response->assertJsonStructure(array $structure); レスポンスが指定したJSONの構造を持っていることをアサート。
$response->assertViewIs($value); ルートにより、指定したビューが返されたことをアサート。
$response->assertViewHas($key, $value = null); レスポンスビューが指定したデータを持っていることをアサート。
$response->assertViewHasAll(array $data); レスポンスビューが指定したリストのデータを持っていることをアサート。
$response->assertViewMissing($key); レスポンスビューが指定したデータを持っていないことをアサート。
$response->assertSee($value); 指定した文字列がレスポンスに含まれていることをアサート。
$response->assertDontSee($value); 指定した文字列がレスポンスに含まれていないことをアサート。
$response->assertSeeText($value); 指定した文字列がレスポンステキストに含まれていることをアサート。
$response->assertDontSeeText($value); 指定した文字列がレスポンステキストに含まれていないことをアサート。