Maison >développement back-end >tutoriel php >Test des URL temporaires dans le stockage Laravel
Laravel fournit une façade de stockage puissante et flexible pour le stockage et les opérations de fichiers. Une fonctionnalité à noter est temporaryUrl()
, qui peut générer des URL temporaires pour les fichiers stockés sur des services comme Amazon S3 ou DigitalOcean Spaces. Cependant, la documentation de Laravel n'explique pas comment tester efficacement cette méthode. Tester cela peut être difficile, en particulier lors de l'utilisation de Storage::fake
, car le pilote de stockage fictif ne prend pas en charge temporaryUrl()
et générera l'erreur suivante :
Ce pilote ne prend pas en charge la création d'URL temporaires.
Dans cet article, nous démontrerons deux méthodes de test Storage::temporaryUrl()
à travers un exemple pratique. Ces méthodes incluent l'émulation d'un système de fichiers et l'utilisation d'un stockage émulé. Les deux méthodes garantissent que vos tests restent isolés et fiables.
Nous illustrerons le processus de test à l'aide d'un PriceExport
modèle, des contrôleurs correspondants et des cas de test. Voici les paramètres :
<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>
Le contrôleur utilise la méthode temporaryUrl
pour générer une URL temporaire pour le fichier :
<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>
Bien que Storage::fake
ne prenne pas en charge nativement temporaryUrl
, nous pouvons simuler un magasin fictif pour émuler le comportement de cette méthode. Cette approche garantit que vous pouvez tester sans avoir besoin d'un véritable service de stockage.
<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>
Cette méthode utilise les capacités de simulation intégrées de Laravel pour simuler directement le comportement de 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
. Utilisez une version simulée du magasin simulé pour résoudre ce problème. Storage::shouldReceive
de Laravel simplifie le processus de simulation de méthodes comme temporaryUrl
lors du test des contrôleurs. En combinant ces techniques, vous pouvez tester efficacement Storage::temporaryUrl()
et vous assurer que la fonctionnalité de votre application est entièrement vérifiée.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!