[Laravel]AssertableJsonの使い方
こんにちは。
ニシザワです。
本日は、Laravel8.xから新たに導入されたAssertableJsonが便利だったので紹介します。
バックエンドはAPIだけ開発するケースも増えてきているかと思います。
AssertableJsonはAPIのResponseがjson時、テストコードを書くにあたり便利に使えます。
UsersController
または、配列の場合は、第一引数に配列のキーを指定し、第二引数でcallableをしていすると入れ子でAssertableJsonが受け取れますので配列の中身までテストすることが可能です。
今回ですと不要なcreated_atやupdated_at,値が決まらないid等をassertから外してくれています。
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が入ったおかげでテストしたい中身だけテストできるようになっているので活用してみてください。