Heim >Backend-Entwicklung >PHP-Tutorial >Testen temporärer URLs im Laravel-Speicher
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.
Wir veranschaulichen den Testprozess anhand eines PriceExport
Modells, entsprechender Controller und Testfälle. Hier sind die Einstellungen:
<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>
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>
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>
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>
temporaryUrl
. Verwenden Sie eine simulierte Version des simulierten Speichers, um dieses Problem zu beheben. Storage::shouldReceive
vereinfacht den Prozess des Verspottens von Methoden wie temporaryUrl
beim Testen von Controllern. 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!