🍣
【Laravel6】Controller以外のテストでHTTPアサートを使いたい
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