開発ブログ

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

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

  1. top >
  2. 開発ブログ >
  3. PHP >
  4. Laravel >
  5. [Laravel]AssertableJsonの使い方

[Laravel]AssertableJsonの使い方

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


本日は、Laravel8.xから新たに導入されたAssertableJsonが便利だったので紹介します。
バックエンドはAPIだけ開発するケースも増えてきているかと思います。
AssertableJsonはAPIのResponseがjson時、テストコードを書くにあたり便利に使えます。

環境

  • PHP: 8.1.9
  • Laravel: v9.29.0

テスト用のAPIを用意

今回はデフォルトで用意されているUserModelを使ったAPIを作成しています。
UsersController

<?php

declare(strict_types=1);

namespace App\Http\Controllers\Users;

use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\JsonResponse;

/**
 * Class UsersController
 * @package App\Http\Controllers\Users
 */
class UsersController extends Controller
{
    /**
     * @return JsonResponse
     */
    public function index(): JsonResponse
    {
        $users = User::all();
        return response()->json($users);
    }
}

一覧の簡単なAPIになります。

一覧取得するAPIの期待するレスポンスをテストしてみる


    /**
     * @testdox ユーザー情報一覧を取得できる
     * @return void
     */
    public function testCanGetIndex(): void
    {
        User::factory()->create(
            [
                'name' => '太郎',
                'email' => 'taro@test.com'
            ]
        );
        User::factory()->create(
            [
                'name' => '花子',
                'email' => 'hanako@test.com'
            ]
        );
        $response = $this->get('api/users');
        $response->assertJson(fn(AssertableJson $json) => $json->has(2)
            ->has('0', fn(AssertableJson $json) => $json->where('name', '太郎')
                ->where('email', 'taro@test.com')
                ->missing('password')
                ->etc()
            )->has('1', fn(AssertableJson $json) => $json->where('name', '花子')
                ->where('email', 'hanako@test.com')
                ->missing('password')
                ->etc()
            )
        );
    }
TestResponseにassertJsonメソッドがあり、第一引数にcallableを指定すると、AssertableJsonを無名関数で受け取ることが可能です。

AssertableJsonのhas

hasメソッドはjsonのキーを持っているかや配列の場合、どれくらいの数を持っているかなどをassertしてくれます。
または、配列の場合は、第一引数に配列のキーを指定し、第二引数でcallableをしていすると入れ子でAssertableJsonが受け取れますので配列の中身までテストすることが可能です。

AssertableJsonのwhere

whereメソッドはkey,expectedで指定し、jsonの構造にプロパティと値があることをassertしてくれます。

AssertableJsonのmissing

missingメソッドはjsonの中に期待しないプロパティがないかをassertしてくれます。

AssertableJsonのetc

etcメソッドはwhereで指定していないがjsonの中にある場合に他のものがあってもエラーとはせずに抜けてくれます。
今回ですと不要なcreated_atやupdated_at,値が決まらないid等をassertから外してくれています。

まとめ

今まで、assertJsonで中身をすべて書いていたこともあったかと思いますが
AssertableJsonが入ったおかげでテストしたい中身だけテストできるようになっているので活用してみてください。
TOPに戻る