Laravel은 파일 저장 및 작업을 위한 강력하고 유연한 Storage 파사드를 제공합니다. 주목할만한 기능 중 하나는 Amazon S3 또는 DigitalOcean Spaces와 같은 서비스에 저장된 파일에 대한 임시 URL을 생성할 수 있는 temporaryUrl()
입니다. 그러나 Laravel의 문서에서는 이 방법을 효과적으로 테스트하는 방법을 다루지 않습니다. 이를 테스트하는 것은 어려울 수 있습니다. 특히 모의 스토리지 드라이버가 Storage::fake
를 지원하지 않고 다음 오류가 발생하므로 temporaryUrl()
을 사용하는 경우에는 더욱 그렇습니다.
이 드라이버는 임시 URL 생성을 지원하지 않습니다.
이 글에서는 Storage::temporaryUrl()
두 가지 테스트 방법을 실제 사례를 통해 보여드리겠습니다. 이러한 방법에는 파일 시스템 에뮬레이션 및 에뮬레이트된 스토리지 사용이 포함됩니다. 두 가지 방법 모두 테스트가 격리되고 안정적으로 유지되도록 보장합니다.
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 Storage에서 임시 URL 테스트의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!