🍣

【Laravel6】Controller以外のテストでHTTPアサートを使いたい

2022/10/14に公開

Controllerのテストを書く時に以下のように書くことが多いと思う

$res = $this->json('GET', '/api/users');
$res->assertJsonFragment(['name' => '田中太郎']);

そして下のようなServiceクラス等で直接 Illuminate\Http\JsonResponse を返す関数に対しても 上記のassertXXX関数を使いたい!

あんまりないと思うけど、DDDやクリーンアーキテクチャを採用しているとドメイン層のオブジェクトをプレゼンター層に露出させたくない時とか、アプリケーション層(ユースケース層)から直接JsonResponseを返す場合もある
ただ、基本こういうときはDAO(Data Access Object)を採用してアプリケーション層(ユースケース層) → プレゼンター層に渡すのがいいかも

class HogeService
{
  public function Hoge(): JsonResponse
  {
    return response()->json(['name' => '田中太郎']);
  }
}

TestResponse::fromBaseResponseを使おう

TestREsponseが持つstatic関数、fromBaseResponseは引数にIllminate\Http\Responseをもらって、Illminate\Foundation\Testing\TestResponseを返す関数

use Illuminate\Foundation\Testing\TestResponse; // 追加

class HogeServiceTest extends TestCase
{
  public function testHoge(): void
  {
    $hoge = new HogeService;
    $res = TestResponse::fromBaseResponse($hoge->Hoge());
    $res->assertJsonFragment(['name' => '田中太郎']);
  }
}

Discussion