ホームページ > バックエンド開発 > PHPチュートリアル > Laravelストレージでの一時URLのテスト

Laravelストレージでの一時URLのテスト

DDD
リリース: 2025-01-13 09:25:43
オリジナル
776 人が閲覧しました

Testing Temporary URLs in Laravel Storage

Laravel の Storage::temporaryUrl() メソッドをテストする方法

Laravel は、ファイルのストレージと操作に強力で柔軟なストレージ ファサードを提供します。注目に値する機能の 1 つは temporaryUrl() で、Amazon S3 や DigitalOcean Spaces などのサービスに保存されているファイルの一時 URL を生成できます。ただし、Laravel のドキュメントでは、このメソッドを効果的にテストする方法については説明されていません。これをテストすることは、特にモック ストレージ ドライバーが Storage::fake をサポートしておらず、次のエラーをスローするため、temporaryUrl() を使用する場合に困難になる可能性があります:

このドライバーは一時 URL の作成をサポートしていません。

この記事では、Storage::temporaryUrl() をテストする 2 つの方法を実際の例を通して説明します。これらの方法には、ファイル システムのエミュレーションとエミュレートされたストレージの使用が含まれます。どちらの方法でも、テストが分離され信頼性が維持されることが保証されます。

設定例

PriceExport モデル、対応するコントローラー、テスト ケースを使用してテスト プロセスを説明します。設定は次のとおりです:

モデル

<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>
ログイン後にコピー

コントローラー

コントローラーは temporaryUrl メソッドを使用してファイルの一時 URL を生成します:

<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>
ログイン後にコピー

temporaryUrl() をテストします

テスト ケース 1: Storage::fake の使用

Storage::faketemporaryUrl をネイティブにサポートしていませんが、モック ストアをシミュレートしてこのメ​​ソッドの動作をエミュレートできます。このアプローチにより、実際のストレージ サービスを必要とせずにテストできるようになります。

<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>
ログイン後にコピー

テスト ケース 2: Storage::ShouldReceive の使用

このメソッドは、Laravel の組み込みシミュレーション機能を利用して、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>
ログイン後にコピー

重要なポイント

  1. Storage::fake の制限: シミュレートされたストレージ ドライバー temporaryUrl ではサポートされていません。この問題を解決するには、シミュレートされたストアのシミュレートされたバージョンを使用します。
  2. モックストレージ: Laravel の Storage::shouldReceive は、コントローラーをテストするときに temporaryUrl のようなメソッドをモックするプロセスを簡素化します。
  3. 分離: どちらの方法でも、テストが外部サービスに依存しないことが保証され、テストの高速性と信頼性が維持されます。

これらの手法を組み合わせることで、Storage::temporaryUrl() を効果的にテストし、アプリケーションの機能が完全に検証されていることを確認できます。

以上がLaravelストレージでの一時URLのテストの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート