Laravel は、ファイルのストレージと操作に強力で柔軟なストレージ ファサードを提供します。注目に値する機能の 1 つは temporaryUrl()
で、Amazon S3 や DigitalOcean Spaces などのサービスに保存されているファイルの一時 URL を生成できます。ただし、Laravel のドキュメントでは、このメソッドを効果的にテストする方法については説明されていません。これをテストすることは、特にモック ストレージ ドライバーが Storage::fake
をサポートしておらず、次のエラーをスローするため、temporaryUrl()
を使用する場合に困難になる可能性があります:
このドライバーは一時 URL の作成をサポートしていません。
この記事では、Storage::temporaryUrl()
をテストする 2 つの方法を実際の例を通して説明します。これらの方法には、ファイル システムのエミュレーションとエミュレートされたストレージの使用が含まれます。どちらの方法でも、テストが分離され信頼性が維持されることが保証されます。
PriceExport
モデル、対応するコントローラー、テスト ケースを使用してテスト プロセスを説明します。設定は次のとおりです:
<code class="language-php">final class PriceExport extends Model { protected $fillable = [ 'user_id', 'supplier_id', 'path', 'is_auto', 'is_ready', 'is_send', ]; public function user(): BelongsTo { return $this->belongsTo(User::class); } public function supplier(): BelongsTo { return $this->belongsTo(Supplier::class); } }</code>
コントローラーは temporaryUrl
メソッドを使用してファイルの一時 URL を生成します:
<code class="language-php">final class PriceExportController extends Controller { /** * @throws ItemNotFoundException */ public function download(PriceExport $priceExport): DownloadFileResource { if (!$priceExport->is_ready || empty($priceExport->path)) { throw new ItemNotFoundException('price export'); } $fileName = basename($priceExport->path); $diskS3 = Storage::disk(StorageDiskName::DO_S3->value); $url = $diskS3->temporaryUrl($priceExport->path, Carbon::now()->addHour()); $downloadFileDTO = new DownloadFileDTO($url, $fileName); return DownloadFileResource::make($downloadFileDTO); } }</code>
Storage::fake
は temporaryUrl
をネイティブにサポートしていませんが、モック ストアをシミュレートしてこのメソッドの動作をエミュレートできます。このアプローチにより、実際のストレージ サービスを必要とせずにテストできるようになります。
<code class="language-php">final class PriceExportTest extends TestCase { public function test_price_export_download_fake(): void { // 安排 $user = $this->getDefaultUser(); $this->actingAsFrontendUser($user); $supplier = SupplierFactory::new()->create(); $priceExport = PriceExportFactory::new()->for($user)->for($supplier)->create([ 'path' => 'price-export/price-2025.xlsx', ]); $expectedUrl = 'https://temporary-url.com/supplier-price-export-2025.xlsx'; $expectedFileName = basename($priceExport->path); $fakeFilesystem = Storage::fake(StorageDiskName::DO_S3->value); // 模拟模拟文件系统 $proxyMockedFakeFilesystem = Mockery::mock($fakeFilesystem); $proxyMockedFakeFilesystem->shouldReceive('temporaryUrl')->andReturn($expectedUrl); Storage::set(StorageDiskName::DO_S3->value, $proxyMockedFakeFilesystem); // 操作 $response = $this->postJson(route('api-v2:price-export.price-exports.download', $priceExport)); // 断言 $response->assertOk()->assertJson([ 'data' => [ 'name' => $expectedFileName, 'url' => $expectedUrl, ] ]); } }</code>
このメソッドは、Laravel の組み込みシミュレーション機能を利用して、temporaryUrl
の動作を直接シミュレートします。
<code class="language-php">final class PriceExportTest extends TestCase { public function test_price_export_download_mock(): void { // 安排 $user = $this->getDefaultUser(); $this->actingAsFrontendUser($user); $supplier = SupplierFactory::new()->create(); $priceExport = PriceExportFactory::new()->for($user)->for($supplier)->create([ 'path' => 'price-export/price-2025.xlsx', ]); $expectedUrl = 'https://temporary-url.com/supplier-price-export-2025.xlsx'; $expectedFileName = basename($priceExport->path); // 模拟存储行为 Storage::shouldReceive('disk')->with(StorageDiskName::DO_S3->value)->andReturnSelf(); Storage::shouldReceive('temporaryUrl')->andReturn($expectedUrl); // 操作 $response = $this->postJson(route('api-v2:price-export.price-exports.download', $priceExport)); // 断言 $response->assertOk()->assertJson([ 'data' => [ 'name' => $expectedFileName, 'url' => $expectedUrl, ] ]); } }</code>
temporaryUrl
ではサポートされていません。この問題を解決するには、シミュレートされたストアのシミュレートされたバージョンを使用します。 Storage::shouldReceive
は、コントローラーをテストするときに temporaryUrl
のようなメソッドをモックするプロセスを簡素化します。 これらの手法を組み合わせることで、Storage::temporaryUrl()
を効果的にテストし、アプリケーションの機能が完全に検証されていることを確認できます。
以上がLaravelストレージでの一時URLのテストの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。