Maison >développement back-end >tutoriel php >Test des URL temporaires dans le stockage Laravel

Test des URL temporaires dans le stockage Laravel

DDD
DDDoriginal
2025-01-13 09:25:43835parcourir

Testing Temporary URLs in Laravel Storage

Comment tester la méthode Storage::temporaryUrl() de 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.

Exemples de paramètres

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 :

Modèle

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

Contrôleur

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>

Tester l'Url temporaire()

Cas de test 1 : Utilisation de Storage::fake

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>

Cas de test 2 : Utilisation de Storage::shouldReceive

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>

Points clés

  1. Limitations de Storage::fake : Non pris en charge par le pilote de stockage simulé temporaryUrl. Utilisez une version simulée du magasin simulé pour résoudre ce problème.
  2. Mock Storage : le Storage::shouldReceive de Laravel simplifie le processus de simulation de méthodes comme temporaryUrl lors du test des contrôleurs.
  3. Isolement : les deux méthodes garantissent que vos tests ne dépendent pas de services externes, gardant ainsi vos tests rapides et fiables.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn