Heim >Backend-Entwicklung >PHP-Tutorial >Testen temporärer URLs im Laravel-Speicher

Testen temporärer URLs im Laravel-Speicher

DDD
DDDOriginal
2025-01-13 09:25:43776Durchsuche

Testing Temporary URLs in Laravel Storage

So testen Sie die Storage::temporaryUrl()-Methode von Laravel

Laravel bietet eine leistungsstarke und flexible Speicherfassade für Dateispeicherung und -vorgänge. Eine erwähnenswerte Funktion ist temporaryUrl(), die temporäre URLs für Dateien generieren kann, die auf Diensten wie Amazon S3 oder DigitalOcean Spaces gespeichert sind. In der Dokumentation von Laravel wird jedoch nicht beschrieben, wie diese Methode effektiv getestet werden kann. Dies zu testen kann eine Herausforderung sein, insbesondere wenn Storage::fake verwendet wird, da der Scheinspeichertreiber temporaryUrl() nicht unterstützt und den folgenden Fehler auslöst:

Dieser Treiber unterstützt nicht das Erstellen temporärer URLs.

In diesem Artikel demonstrieren wir zwei Testmethoden Storage::temporaryUrl() anhand eines praktischen Beispiels. Zu diesen Methoden gehören die Emulation eines Dateisystems und die Verwendung von emuliertem Speicher. Beide Methoden stellen sicher, dass Ihre Tests isoliert und zuverlässig bleiben.

Beispieleinstellungen

Wir veranschaulichen den Testprozess anhand eines PriceExportModells, entsprechender Controller und Testfälle. Hier sind die Einstellungen:

Modell

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

Controller

Der Controller verwendet die Methode temporaryUrl, um eine temporäre URL für die Datei zu generieren:

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

TemporäreUrl() testen

Testfall 1: Verwendung von Storage::fake

Obwohl Storage::fake temporaryUrl nicht nativ unterstützt, können wir einen Scheinspeicher simulieren, um das Verhalten dieser Methode zu emulieren. Dieser Ansatz stellt sicher, dass Sie testen können, ohne dass ein echter Speicherdienst erforderlich ist.

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

Testfall 2: Verwendung von Storage::shouldReceive

Diese Methode nutzt die integrierten Simulationsfunktionen von Laravel, um das Verhalten von temporaryUrl direkt zu simulieren.

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

Wichtige Punkte

  1. Speicherbeschränkungen::fake: Wird vom simulierten Speichertreiber nicht unterstützt temporaryUrl. Verwenden Sie eine simulierte Version des simulierten Speichers, um dieses Problem zu beheben.
  2. Mock Storage: Laravel's Storage::shouldReceive vereinfacht den Prozess des Verspottens von Methoden wie temporaryUrl beim Testen von Controllern.
  3. Isolation: Beide Methoden stellen sicher, dass Ihre Tests nicht von externen Diensten abhängig sind und Ihre Tests schnell und zuverlässig bleiben.

Durch die Kombination dieser Techniken können Sie effektiv Storage::temporaryUrl() testen und sicherstellen, dass die Funktionalität Ihrer Anwendung vollständig überprüft wird.

Das obige ist der detaillierte Inhalt vonTesten temporärer URLs im Laravel-Speicher. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn