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メソッド便利ですね。
人の目に触れるものを書くのは初めてなのでわかりづらい等あってもご容赦下さい。
ただ間違いがある場合は指摘して頂けたら嬉しいです。