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()
)
);