Laravelのテスト機能の中に題を実現できるものがあります。次のリンク先の”ファイルアップロードのテスト”に説明があります。
HTTPテスト 6.x Laravel
次の様に書くとアップロードとレスポンスを実行できます。
$request = [
'images' => [
// UploadedFile::fake()から色々できます
$originalImage = UploadedFile::fake()->image('dummy.jpg'),
]
];
$this->response = $this->json(
'POST',
route('image.upload'),
$request
);
レスポンスは通常のHTTPテスト同様に次の様に書いたり
public function testUploadImageSuccess(): void
{
// 上述のアップロードとレスポンス取得処理
$this->assertApiResponseHas('imageUrls');
}
public function assertApiResponseHas($key): void
{
$responseData = $this->getDecodedResponseBody();
$this->assertTrue(\Arr::has($responseData, $key), "レスポンスに${key}が見つかりません");
}
/**
* レスポンスのデータ本体を抜き出す
* @return array
*/
public function getDecodedResponseBody(): array
{
return json_decode($this->response->getContent(), true);
}
セットでダウンロードできるかテストしたり
// 上述のアップロードとレスポンス取得処理
foreach ($responseBody['imageUrls'] as $url) {
$imageResponse = $this->json(
'GET',
$url,
);
$this->assertEquals(HttpStatus::OK, $imageResponse->getStatusCode());
}
ファイルが実際に保存されたかテストしたりできます。
Storage::disk('userUploaded')->assertExists($originalImage->getClientOriginalName());