もがき系プログラマの日常

もがき系エンジニアの勉強したこと、日常のこと、気になっている技術、備忘録などを紹介するブログです。

laravelでファイルアップロードのテスト

はじめに

こんばんは。

今回もlaravelネタで簡単な備忘録です。

画像をアップロードするようなアクションのテストを行いたい場合の対応です。

本題

アップロードするアクションは以下のような感じだとします。

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Http\Requests\UploadRequest;

class UploadController extends Controller
{
    public function __invoke(UploadRequest $request) 
    {
        $request->file('image')->storeAs(
            '/path/to/uploaded.png',
            's3'
        );

        return redirect()->route('list');
    }
}

このテストは以下の通り

<?php

namespace Tests\Feature;

use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use Tests\TestCase;

class UploadControllerTest extends TestCase
{
    /**
     * @test
     */
    public function invoke_upload_success(): void
    {
        Storage::fake('s3');

        $image = UploadedFile::fake()->image('dummy.png');
        $response = $this->post(route('upload'), [
            'image' => $image,
        ]);

        $response->assertStatus(302);
        $response->assertRedirect(route('list'));
    }
}

重要なのは 2つ

Storage::fake('s3');

Storage::fakestorage/framework/testing/disks/ 以下にアップロードされるようになります。

UploadedFile::fake()->image('dummy.png');

UploadedFile::fake() でアップロード処理のダミーを再現できるようになります。

終わりに

結構アップロードのテストはめんどくさいから後回しにしがちですけど、めっちゃ簡単ですね。

簡単ですが、現場からは以上です。