開発ブログ

株式会社Nextatのスタッフがお送りする技術コラムメインのブログ。

電話でのお問合わせ 075-744-6842 ([月]-[金] 10:00〜17:00)

  1. top >
  2. 開発ブログ >
  3. PHP >
  4. Laravel >
  5. Laravel+Inertiaでテストコード書いてみる

Laravel+Inertiaでテストコード書いてみる

こんにちは。
ニシザワです。


本日は、Laravel+Inertiaでのテストコードについて書いていきます。
本ブログではLaravelやInertia.jsのインストール方法は説明しません

環境

PHP:8.1
Laravel: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は非常よくできたライブラリだと思うので、積極的に使っていきたいですね。
今回は以上となります。
TOPに戻る