Laravel 7 には、ファイルを S3 ディスクに保存し、一時的な URL を返すルートがあります。コードを簡略化すると、次のようになります。
Storage::disk('s3')->put('image.jpg', $file);
return Storage::disk('s3')->temporaryUrl('image.jpg');
そのルートのテストを書きたいと思います。これは通常、Laravel では簡単です。でストレージをモックしStorage::fake('s3')
、でファイルの作成をアサートしますStorage::disk('s3')->assertExists('image.jpg')
。
フェイクストレージは対応しておりませんStorage::temporaryUrl()
。そのメソッドを使用しようとすると、次のエラーがスローされます。
このドライバーは、一時 URL の作成をサポートしていません。
一般的な回避策は、Laravel の低レベルのモック API を次のように使用することです。
Storage::shouldReceive('temporaryUrl')
->once()
->andReturn('http://examples.com/a-temporary-url');
この解決策は、LaraCasts スレッドとGitHub の問題で推奨されており、Storage::fake()
.
その 2 つのアプローチを組み合わせて、両方を行うルートをテストする方法はありますか?
再実装は避けたいStorage::fake()
。Storage::temporaryUrl()
また、環境がテスト中の場合は呼び出さないというチェックを本番コードに追加することは避けたいと思います。後者は、前述の LaraCasts スレッドで提案されている別の回避策です。