LoginSignup
6
1

More than 1 year has passed since last update.

LaravelのPHPUnitでS3へのアップロードテスト

Last updated at Posted at 2022-06-17

PHPUnitでファイルアップロードのテストを書いたのはいいけども忘れそうなので備忘録として。。

前提

filesistems.phpとか
.env.testingファイルなどは作成、設定済みとします。

やりたいこと

APIでs3にファイルをアップロードして該当ファイルがあればOK、なければNGとするMiddlewareを実装したかった

テストコード

/**
 * Middleware Check(OK)
 * @return void
 * @group upload_test
 */
public function middleware_upload_check_ok(): void
{
        //実際のs3ではなく仮のストレージを割り当てる
    Storage::fake('s3');
    //対象ファイルがないことを確認
    Storage::disk('s3')->assertMissing('/maintenance_test/maintenance.txt');

    // ミドルウェアのチェックもしたいのでなんかしらAPIを呼ぶ
    $response = $this->get('/api/user');
    $response->assertOk();
}

/**
 * Middleware Check(NG)
 * @return void
 * @group upload_test
 */
public function middleware_upload_check_ng(): void
{
    $filename = 'piyo.txt';
    Storage::fake('s3');
        //fakes3に指定ファイルを置いて確認
    $dummy = UploadedFile::fake()->create('piyo.txt');
    $dummy->storeAs('hoge', $filename, ['disk' => 's3']);
    //ファイルがあることを確認
    Storage::disk('s3')->assertExists('hoge/piyo.txt');

    //何かしら API呼び期待するステータスになることを確認
    $response = $this->get('/api/user');
    $response->assertStatus(503);
}

テストを実行

テストクラスを実行
$ ./vendor/bin/phpunit テストファイル名.php
全部は時間かかるからアノテーションでgroup書いて特定のメソッドだけ実行させる(今回であれば upload_test という名前つけてある)
$ ./vendor/bin/phpunit テストファイル名.php --group upload_test

一応Middlewareの簡易コード

public function handle(Request $request, Closure $next)
{
    $s3_file_path = "hoge/piyo.txt";
    if (Storage::disk('s3')->exists($s3_file_path)) {
        $res = response()->json([
            'status' => 503,
            'message' => 's3にファイルがあるからNG'
        ], 503);

        throw new HttpResponseException($res);
    } else {
        return $next($request);
    }
}

おわりに

fakeメソッド便利ですね。

人の目に触れるものを書くのは初めてなのでわかりづらい等あってもご容赦下さい。
ただ間違いがある場合は指摘して頂けたら嬉しいです。

参考リンク

テストの準備

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1