テスト

Inertia アプリケーションをテストするにはさまざまな方法があります。このページでは、利用可能なツールについて簡単に overview ます。

エンドツーエンドテスト

JavaScript ページコンポーネントをテストする一般的なアプローチの 1 つは、次のようなエンドツーエンドテストツールを使用することです。 Cypress または Laravel Dusk。これらは、ブラウザでアプリケーションの実際のシミュレーションを実行できるブラウザ自動化ツールです。これらのテストは低速であることが知られています。ただし、エンドユーザーと同じレイヤーでアプリケーションをテストするため、アプリケーションが正しく動作しているという確信を高めることができます。また、これらのテストはブラウザで実行されるため、JavaScript コードも実際に実行およびテストされます。

クライアントサイドユニットテスト

ページコンポーネントをテストするもう 1 つの方法は、次のようなクライアントサイドユニットテストフレームワークを使用することです。 Jest または Mocha。このアプローチでは、Node.js を使用して JavaScript ページコンポーネントを分離してテストできます。

エンドポイントテスト

JavaScript ページコンポーネントのテストに加えて、サーバーサイドフレームワークによって返される Inertia レスポンスもテストする必要があるでしょう。これを行うための一般的なアプローチは、アプリケーションにリクエストを行い、レスポンスを調べるエンドポイントテストを使用することです。Laravel は これらのタイプのテストを実行するためのツールを提供しています

ただし、このプロセスをさらに簡単にするために、Inertia の Laravel アダプターは追加の HTTP テストツールを提供します。例を見てみましょう。

use Inertia\Testing\AssertableInertia as Assert;

class PodcastsControllerTest extends TestCase
{
    public function test_can_view_podcast()
    {
        $this->get('/podcasts/41')
            ->assertInertia(fn (Assert $page) => $page
                ->component('Podcasts/Show')
                ->has('podcast', fn (Assert $page) => $page
                    ->where('id', $podcast->id)
                    ->where('subject', 'The Laravel Podcast')
                    ->where('description', 'The Laravel Podcast brings you Laravel and PHP development news and discussion.')
                    ->has('seasons', 4)
                    ->has('seasons.4.episodes', 21)
                    ->has('host', fn (Assert $page) => $page
                        ->where('id', 1)
                        ->where('name', 'Matt Stauffer')
                    )
                    ->has('subscribers', 7, fn (Assert $page) => $page
                        ->where('id', 2)
                        ->where('name', 'Claudio Dekker')
                        ->where('platform', 'Apple Podcasts')
                        ->etc()
                        ->missing('email')
                        ->missing('password')
                    )
                )
            );
    }
}

上記の例でわかるように、これらのアサーションメソッドを使用して、Inertia レスポンスに提供されるデータの内容に対してアサーションを実行できます。さらに、配列データが特定の長さを持っていることをアサーションしたり、アサーションのスコープを指定したりすることもできます。

利用可能なアサーションについて詳しく見ていきましょう。まず、Inertia レスポンスにプロパティがあることをアサーションするには、has メソッドを使用できます。このメソッドは、PHP の isset 関数に似ていると考えることができます。

$response->assertInertia(fn (Assert $page) => $page
    // Checking a root-level property...
    ->has('podcast')

    // Checking nested properties using "dot" notation...
    ->has('podcast.id')
);

Inertia プロパティに指定された数のアイテムがあることをアサーションするには、has メソッドの 2 番目の引数として予期されるサイズを指定できます。

$response->assertInertia(fn (Assert $page) => $page
    // Checking if a root-level property has 7 items...
    ->has('podcasts', 7)

    // Checking nested properties using "dot" notation...
    ->has('podcast.subscribers', 7)
);

has メソッドは、ネストされたプロパティに対してアサーションを実行する際の繰り返しを少なくするために、プロパティのスコープを指定するためにも使用できます。

$response->assertInertia(fn (Assert $page) => $page
    // Creating a single-level property scope...
    ->has('message', fn (Assert $page) => $page
        // We can now continue chaining methods...
        ->has('subject')
        ->has('comments', 5)

        // And can even create a deeper scope using "dot" notation...
        ->has('comments.0', fn (Assert $page) => $page
            ->has('body')
            ->has('files', 1)
            ->has('files.0', fn (Assert $page) => $page
                ->has('url')
            )
        )
    )
);

配列またはコレクションである Inertia プロパティのスコープを指定する場合、最初のアイテムのスコープを指定することに加えて、指定された数のアイテムが存在することをアサーションすることもできます。

$response->assertInertia(fn (Assert $page) => $page
    // Assert that there are 5 comments and automatically scope into the first comment...
    ->has('comments', 5, fn (Assert $page) => $page
        ->has('body')
        // ...
    )
);

Inertia プロパティに予期される値があることをアサーションするには、where アサーションを使用できます。

$response->assertInertia(fn (Assert $page) => $page
    ->has('message', fn (Assert $page) => $page
        // Assert that the subject prop matches the given message...
        ->where('subject', 'This is an example message')

        // Or, assert against deeply nested values...
        ->where('comments.0.files.0.name', 'example-attachment.pdf')
    )
);

Inertia のテストメソッドは、スコープ内のプロパティの少なくとも 1 つと対話していない場合、自動的に失敗します。これは一般的に便利ですが、信頼できないデータ (外部フィードからのデータなど) を扱っている場合や、テストを簡潔にするために実際に対話したくないデータがある場合に問題が発生する可能性があります。このような状況のために、etc メソッドが存在します。

$response->assertInertia(fn (Assert $page) => $page
    ->has('message', fn (Assert $page) => $page
        ->has('subject')
        ->has('comments')
        ->etc()
    )
);

missing メソッドは has メソッドの正反対であり、プロパティが存在しないことを確認します。このメソッドは etc メソッドと非常に相性が良いです。

$response->assertInertia(fn (Assert $page) => $page
    ->has('message', fn (Assert $page) => $page
        ->has('subject')
        ->missing('published_at')
        ->etc()
    )
);