Laravel+Inertiaでテストコード書いてみる
こんにちは。
ニシザワです。
本日は、Laravel+Inertiaでのテストコードについて書いていきます。
本ブログではLaravelやInertia.jsのインストール方法は説明しません
Laravel:10.x
inertiajs/inertia-laravel:0.6.9
editに対してテストコードを書いていきます。
inertia-laravelのライブラリがAssertableJsonをAssertableInertiaに変換して返してくれます。
AssertableInertia自体はAssertableJsonを継承していてInertiaResponseどうかのチェックをしています。
参考
これだけで、InertiaのResponseが保証できるので便利ですね。
componentメソッドで、InertiaResponseで指定している、JavaScriptのComponentを指定し、チェックが可能になっています。
後は、AssertableJsonを使って、Responseの内容をチェックしていく流れになります。
Inertiaは非常よくできたライブラリだと思うので、積極的に使っていきたいですね。
今回は以上となります。
ニシザワです。
本日は、Laravel+Inertiaでのテストコードについて書いていきます。
本ブログではLaravelやInertia.jsのインストール方法は説明しません
環境
PHP:8.1Laravel:10.x
inertiajs/inertia-laravel:0.6.9
簡単な投稿を準備
Modelは以下とします
<?php
declare(strict_types=1);
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Carbon;
use App\Database\Factories\PostFactory;
/**
* @property int $id ID
* @property string $title タイトル
* @property string $content 内容
* @property Carbon|null $created_at 作成日時
* @property Carbon|null $updated_at 更新日時
*/
class Post extends Model
{
use HasFactory;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'title',
'content',
];
/**
* @return AdminFactory
*/
protected static function newFactory()
{
return PostFactory::new();
}
}
Controllerでは以下とします
<?php
declare(strict_types=1);
namespace App\Http\Controllers;
use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Facades\DB;
use Inertia\Inertia;
use Inertia\Response;
use Throwable;
use App\Models\Post;
class PostController extends Controller
{
/**
* 編集ページ
* @param Post $post
* @return Response
*/
public function edit(Post $post): Response
{
return Inertia::render('Post/Index', compact('post'));
}
/**
* @param Post $post
* @param UpdatePostRequest $request
* @return RedirectResponse
*/
public function update(Post $post, UpdatePostRequest $request): RedirectResponse
{
try {
DB::beginTransaction();
$post->update($request->validated());
DB::commit();
} catch (Throwable $e) {
DB::rollBack();
logs()->error($e);
return redirect()
->route('post.edit', $post)
->withInput()
->with(['error-message' => '投稿の作成に失敗しました。']);
}
return redirect()
->route('post.edit', $post)
->with(['message' => '投稿を作成しました。']);
}
}
よくあるやつですね。
Inertiaを使ってテストコードを書く
ここからが本題です。editに対してテストコードを書いていきます。
/**
* @return void
*/
public function test投稿編集の初期画面で投稿を取得可能(): void
{
$post = Post::factory()->create(
[
'title' => '投稿タイトル',
'content' => '投稿内容'
]
);
$response = $this->get('/posts/' . $post->id);
$response->assertInertia(function (AssertableInertia $page) use ($post) {
$page->component('Post/Edit')
->where('post.id', $post->id)
->where('post.title', '投稿タイトル')
->where('post.content', '投稿内容')
->etc();
});
}
InertiaResponseに対しては$response->assertInertiaを書くのがポイントです。inertia-laravelのライブラリがAssertableJsonをAssertableInertiaに変換して返してくれます。
AssertableInertia自体はAssertableJsonを継承していてInertiaResponseどうかのチェックをしています。
参考
これだけで、InertiaのResponseが保証できるので便利ですね。
componentメソッドで、InertiaResponseで指定している、JavaScriptのComponentを指定し、チェックが可能になっています。
後は、AssertableJsonを使って、Responseの内容をチェックしていく流れになります。
Inertiaは非常よくできたライブラリだと思うので、積極的に使っていきたいですね。
今回は以上となります。