2
Help us understand the problem. What are the problem?

posted at

updated at

Organization

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

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メソッド便利ですね。

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

参考リンク

テストの準備

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
2
Help us understand the problem. What are the problem?