> 백엔드 개발 > PHP 튜토리얼 > Laravel Storage에서 임시 URL 테스트

Laravel Storage에서 임시 URL 테스트

DDD
풀어 주다: 2025-01-13 09:25:43
원래의
776명이 탐색했습니다.

Testing Temporary URLs in Laravel Storage

Laravel의 Storage::temporaryUrl() 메소드를 테스트하는 방법

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>
로그인 후 복사

temporaryUrl() 테스트

테스트 사례 1: Storage::fake 사용

Storage::faketemporaryUrl을 기본적으로 지원하지 않지만, 이 메서드의 동작을 에뮬레이트하기 위해 모의 저장소를 시뮬레이션할 수 있습니다. 이 접근 방식을 사용하면 실제 스토리지 서비스 없이도 테스트할 수 있습니다.

<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>
로그인 후 복사

테스트 사례 2: Storage::shouldReceive 사용

이 방법은 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>
로그인 후 복사

핵심사항

  1. 스토리지 제한::fake: 시뮬레이션된 스토리지 드라이버에서 지원되지 않습니다temporaryUrl. 이 문제를 해결하려면 시뮬레이션된 매장의 시뮬레이션 버전을 사용하세요.
  2. 모의 저장소: Laravel의 Storage::shouldReceive는 컨트롤러를 테스트할 때 temporaryUrl와 같은 모의 메서드 프로세스를 단순화합니다.
  3. 격리: 두 방법 모두 테스트가 외부 서비스에 종속되지 않도록 하여 테스트를 빠르고 안정적으로 유지합니다.

이러한 기술을 결합하면 Storage::temporaryUrl() 효과적으로 테스트하고 애플리케이션 기능이 완전히 검증되었는지 확인할 수 있습니다.

위 내용은 Laravel Storage에서 임시 URL 테스트의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿