意外と簡単だったLaravelで画像アップロードテスト


Laravelで画像アップロード処理を実装したいのですが、
フロント側まだ作ってないので、テストを作って裏側だけで画像アップロードの挙動を確認したのでその流れを残しておきます。

テスト作成

$ php artisan make:test ImageUploadTest

テストコード

class ImageUploadTest extends TestCase
{
    public function testUploadImage()
    {
        //フェイクディスクの作成
        //storage/framework/testing/disks/designに保存用ディスクが作成される
        //(指定しなければdesignではなくlocalフォルダが保存用に使用される)
        Storage::fake('design'); // テスト後ファイルは削除される
        // Storage::persistentFake('design'); テスト後も画像ファイルが残る

        // 画像アップロード用サービスクラス作成(僕はS3にアップロード)
        $imageService = new ImageService(new S3ImageUploader);

        // UploadedFileクラス用意
        $uploadedFile = UploadedFile::fake()->image('design.jpg');

        // 作成した画像を移動
                // 移動しない場合は /private/var/folders/sf/hfbkqhw17xz_cgzwd5xhp7nm0000gn/T/phprqilrq みたいなパスに保存されてた 
        $uploadedFile->move('storage/framework/testing/disks/design');

        // S3にアップロードする処理
        $imageService->upload($uploadedFile);

        // storage/framework/testing/disks/design内に該当ファイルが存在するか
        // S3にアップロードされたかはS3のバケットを確認しました。
        Storage::disk('design')->assertExists($uploadedFile->getFilename());

    }
}

個人的にはこれで仮画像作成してくれんのが便利だなーと思いました。

$uploadedFile = UploadedFile::fake()->image('design.jpg');

S3へのアップロードはこちらを参考
PHPでAWSのS3に画像アップロード&画像を画面表示(設定〜実装まで)