Rumah >pembangunan bahagian belakang >tutorial php >Menguji URL Sementara dalam Storan Laravel

Menguji URL Sementara dalam Storan Laravel

DDD
DDDasal
2025-01-13 09:25:43776semak imbas

Testing Temporary URLs in Laravel Storage

Cara menguji kaedah Storan Laravel::temporaryUrl()

Laravel menyediakan fasad Storan yang berkuasa dan fleksibel untuk penyimpanan dan operasi fail. Satu ciri yang perlu diberi perhatian ialah temporaryUrl(), yang boleh menjana URL sementara untuk fail yang disimpan pada perkhidmatan seperti Amazon S3 atau DigitalOcean Spaces. Walau bagaimanapun, dokumentasi Laravel tidak merangkumi cara menguji kaedah ini dengan berkesan. Menguji ini boleh menjadi mencabar, terutamanya apabila menggunakan Storage::fake kerana pemacu storan olok-olok tidak menyokong temporaryUrl() dan akan membuang ralat berikut:

Pemandu ini tidak menyokong pembuatan URL sementara.

Dalam artikel ini, kami akan menunjukkan dua kaedah ujian Storage::temporaryUrl() melalui contoh praktikal. Kaedah ini termasuk meniru sistem fail dan menggunakan storan yang ditiru. Kedua-dua kaedah memastikan ujian anda kekal terpencil dan boleh dipercayai.

Tetapan contoh

Kami akan menggambarkan proses ujian menggunakan model PriceExport, pengawal yang sepadan dan kes ujian. Berikut ialah tetapan:

Model

<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>

Pengawal

Pengawal menggunakan kaedah temporaryUrl untuk menjana URL sementara untuk fail:

<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>

Uji sementaraUrl()

Kes Ujian 1: Menggunakan Storan::palsu

Walaupun Storage::fake tidak menyokong temporaryUrl secara asli, kami boleh mensimulasikan kedai olok-olok untuk meniru gelagat kaedah ini. Pendekatan ini memastikan anda boleh menguji tanpa memerlukan perkhidmatan storan sebenar.

<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>

Kes Ujian 2: Menggunakan Storan::shouldReceive

Kaedah ini menggunakan keupayaan simulasi terbina dalam Laravel untuk mensimulasikan secara langsung kelakuan 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>

Perkara Penting

  1. Had Storan::palsu: Tidak disokong oleh pemacu storan simulasi temporaryUrl. Gunakan versi simulasi kedai simulasi untuk menyelesaikan isu ini.
  2. Storan Mock: Storage::shouldReceive Laravel memudahkan proses kaedah mengejek seperti temporaryUrl semasa menguji pengawal.
  3. Pengasingan: Kedua-dua kaedah memastikan ujian anda tidak bergantung pada perkhidmatan luaran, memastikan ujian anda cepat dan boleh dipercayai.

Dengan menggabungkan teknik ini, anda boleh menguji Storage::temporaryUrl() dengan berkesan dan memastikan kefungsian aplikasi anda disahkan sepenuhnya.

Atas ialah kandungan terperinci Menguji URL Sementara dalam Storan Laravel. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn