はじめに
こんばんは。
今回も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::fake
で storage/framework/testing/disks/
以下にアップロードされるようになります。
UploadedFile::fake()->image('dummy.png');
UploadedFile::fake()
でアップロード処理のダミーを再現できるようになります。
終わりに
結構アップロードのテストはめんどくさいから後回しにしがちですけど、めっちゃ簡単ですね。
簡単ですが、現場からは以上です。