测试 Laravel 存储中的临时 URL

测试 laravel 存储中的临时 url

如何测试 Laravel 的 Storage::temporaryUrl() 方法

Laravel 提供了强大的文件存储和操作功能。temporaryUrl() 方法可以为存储在 Amazon S3 或 DigitalOcean Spaces 等云存储服务上的文件生成临时 URL。然而,Laravel 的文档并没有详细说明如何有效地测试此方法。尤其是在使用 Storage::fake() 时,测试会比较棘手,因为模拟存储驱动程序不支持 temporaryUrl(),并会抛出错误:

此驱动程序不支持创建临时 URL。

本文将通过实际示例演示两种测试 Storage::temporaryUrl() 的方法:模拟文件系统和使用模拟存储。这两种方法都能确保测试的隔离性和可靠性。

示例设置

我们将使用 PriceExport 模型、对应的控制器和测试用例来说明测试过程。

模型

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);    }}

控制器

控制器使用 temporaryUrl() 方法为文件生成临时 URL:

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);        $disk = Storage::disk(StorageDiskName::DO_S3->value);        $url = $disk->temporaryUrl($priceExport->path, Carbon::now()->addHour());        $downloadFileDto = new DownloadFileDto($url, $filename);        return DownloadFileResource::make($downloadFileDto);    }}

测试 temporaryUrl()

测试用例 1:模拟 Storage::fake()

尽管 Storage::fake() 本身不支持 temporaryUrl(),但我们可以模拟假存储来模拟此方法的行为。这样,测试无需依赖实际的存储服务。

final class PriceExportTest extends TestCase{    public function test_price_export_download_fake(): void    {        // Arrange        $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);        // 模拟假文件系统        $mockedFakeFilesystem = Mockery::mock($fakeFilesystem);        $mockedFakeFilesystem->shouldReceive('temporaryUrl')->andReturn($expectedUrl);        Storage::shouldReceive('disk')->with(StorageDiskName::DO_S3->value)->andReturn($mockedFakeFilesystem);        // Act        $response = $this->postJson(route('api-v2:price-export.price-exports.download', $priceExport));        // Assert        $response->assertOk()->assertJson([            'data' => [                'name' => $expectedFileName,                'url' => $expectedUrl,            ]        ]);    }}

测试用例 2:使用 Storage::shouldReceive()

此方法利用 Laravel 内置的模拟功能直接模拟 temporaryUrl() 的行为。

final class PriceExportTest extends TestCase{    public function test_price_export_download_mock(): void    {        // Arrange        $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')->with($priceExport->path, Carbon::now()->addHour())->andReturn($expectedUrl);        // Act        $response = $this->postJson(route('api-v2:price-export.price-exports.download', $priceExport));        // Assert        $response->assertOk()->assertJson([            'data' => [                'name' => $expectedFileName,                'url' => $expectedUrl,            ]        ]);    }}

关键点

Storage::fake() 的限制: 模拟存储驱动程序不支持 temporaryUrl()。需要模拟其行为。模拟存储: Laravel 的 Storage::shouldReceive() 简化了对控制器方法(如 temporaryUrl())的模拟。隔离性: 这两种方法都确保测试不依赖外部服务,从而保持测试的快速和可靠。

通过结合这些技术,您可以有效地测试 Storage::temporaryUrl() 并确保应用程序功能的完整性。

以上就是测试 Laravel 存储中的临时 URL的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1284107.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月11日 00:24:06
下一篇 2025年12月11日 00:24:20

相关推荐

  • 什么是稳定币?2025市值前五稳定币盘点

    稳定币是价值与外部资产挂钩的加密货币,旨在解决价格波动问题。主要分为三类:由法币抵押的如USDT、USDC,由加密资产超额抵押的如DAI,以及通过算法调节供应量的算法稳定币。其中USDT因流动性强预计2025年仍居首位,USDC凭借合规优势稳居第二,DAI作为去中心化代表在DeFi中不可或缺,FDU…

    2025年12月11日
    000
  • 币安官方网站2025最新链接 币安官网安全进入通道

    币安官方网站2025最新链接在哪里?这是不少网友都关注的,接下来由php小编为大家带来币安官网安全进入通道,感兴趣的网友一起随小编来瞧瞧吧! 币安官方网站入口: 币安官方APP下载: 平台注册与账户设置流程 1、进入官网后点击注册按钮,输入有效的电子邮箱并设置高强度密码,系统会发送验证码进行身份核验…

    2025年12月11日
    000
  • 对于NFT市场,OpenSea和Blur哪个更具领导力

    1、2025年初Blur以4.39亿美元月交易量占近50%份额超越OpenSea,后者降至1.41亿美元;2、OpenSea用户超61万储存包地址,品牌认知强于专注专业交易者的Blur;3、OpenSea推$SEA代币与多链支持,Blur以高级工具和收益机制领先交易体验。 分析OpenSea与Blu…

    2025年12月11日
    000
  • 卡尔达诺(ADA)生态发展分析,2025、2026-2030年价格预测

    卡尔达诺通过Vasil硬分叉提升智能合约性能,吸引开发者;Hydra Layer-2提高吞吐量降低延迟;Voltaire治理实现去中心化决策;Intersek跨链桥接以太坊增强互操作性;NFT与DeFi生态协同发展推动价值增长。 卡尔达诺(ADA)作为第三代区块链平台,其生态发展与价格走势备受关注。…

    2025年12月11日
    000
  • 加密深度洞察平台盘点?4款开源数据源点亮未来

    1、通过区块链浏览器API可快速获取链上数据,需注册获取密钥并遵守调用限制;2、部署全节点如Geth能实现数据完全掌控,但需大存储与高带宽;3、集成Dune等开源分析框架可加速构建分析模型,支持储存包聚类与资金图谱生成;4、订阅Chainlink等去中心化预言机可获取可信外部数据,用于链内外信息交叉…

    2025年12月11日
    000
  • 2026比特币狂飙信号?周期对比表预测万倍回报

    比特币2026年走势将受减半周期、MVRV与NUPL指标、链上巨鲸动向及全球货币政策共同影响。历史数据显示,减半后12至18个月见顶,2024年4月减半对应2025年中至2025年末为高点窗口,当前已进入下行初期;MVRV若低于2.0且NUPL低于0.5,或预示低估买入机会;链上超1000 BTC大…

    2025年12月11日
    000
  • 2025比特币牛市信号?历史周期对比与指标表

    2025年比特币或处于牛市周期,历史减半规律显示本轮高点可能出现在5至10月;MVRV Z-Score为4.2,未达过热水平,上涨空间仍存;PiCycle Oscillator显示看涨动能积聚;超74%供应量沉睡,流通性紧缩加剧;交易所储备降至12.3%,抛压趋弱,支撑价格上行。 2025年比特币市…

    2025年12月11日
    000
  • 2025年比特币市场回顾?年度价格高低点详解表

    2025年比特币价格最高达126,000美元(10月7日),受ETF资金流入、技术面突破与巨鲸增持推动;随后因美联储紧缩、ETF大额赎回及衍生品爆仓,最低回落至93,778.6美元(11月17日);年初高点109,225美元由政策预期驱动,年末跌至95,000美元附近现超卖信号,RSI达26,短期持…

    2025年12月11日
    000
  • 空气币是什么_新手应该怎么识别毫无产品支撑的空气项目

    空气币是缺乏实际应用与产品支撑的虚拟货币,常以虚假宣传吸引投资,本质是高风险的投机骗局。一、审查项目白皮书与技术细节,查看是否具备清晰的技术架构、代码逻辑及开源记录,避免内容空洞或长期未更新的项目。二、验证团队成员真实性,通过公开平台核验履历与身份,警惕匿名或AI生成的虚假团队。三、分析代币经济模型…

    2025年12月11日
    000
  • 2023比特币减半前瞻,附历史减半价格对比表

    第四次比特币减半已于2024年4月完成,而非2023年。历次减半后区块奖励减半,价格在周期内均显著上涨:2012年涨幅达9552%,2016年为3055%,2020年为772%,2024年减半后价格于2025年10月突破12.6万美元,涨幅超100%。 比特币减半是其底层协议设定的周期性事件,大约每…

    2025年12月11日
    000
  • 2025年altcoin熊市分析,附类别价格对比表

    2025年altcoin市场整体承压,主流、DeFi、Layer 1及meme币普遍大幅回落,ETH跌33%、BNB跌35%、SOL跌55%、WIF跌67%,反映市场风险偏好下降与资本向比特币回流。 2025年altcoin市场整体承压,多数代币从高点回落,部分类别跌幅显著。 一、主流代币熊市表现 …

    2025年12月11日
    000
  • 2025比特币牛市爆发的秘密?减半后价格飙升详解表

    比特币2025年上涨源于减半后供给减少、机构通过ETF大举买入、宏观宽松环境及链上囤积加剧,推动其稀缺性与市场需求共振上升。 binance币安交易所 Binance币安注册入口: Binance币安APP下载: 欧易OKX交易所 欧易(OKX)注册入口: 欧易(OKX)注册APP下载: 火币HTX…

    2025年12月11日
    000
  • 加密货币的“旁氏骗局”有哪些特征?七个信号帮你提前识别

    旁氏骗局在加密货币领域频发,其核心特征包括:一、承诺不切实际的高收益,如“年化50%”或“日息1%”,并宣称“稳赚不赔”;二、团队信息虚假或匿名,缺乏可验证的专业背景;三、白皮书内容空洞,滥用术语却无实际技术方案;四、资金流动依赖新投资者支付老投资者,模式不可持续;五、利用FOMO心理制造紧迫感,催…

    2025年12月11日
    000
  • 什么是公链生态_用户应该怎么评估公链的扩展性与安全性

    %ignore_a_1%需从共识机制、扩展性、安全性等维度评估。一、分析共识机制类型:1. 查看公链采用PoS、DPoS等机制,记录区块时间与节点数;2. 对比以太坊、BNB Chain等主流链的共识设计,评估抗攻击能力;3. 关注官方文档中最终确定性说明,强最终确定性降低双花风险。二、监测网络拥堵…

    2025年12月11日
    000
  • SOL币历年牛市价格表现回顾 索拉纳价格走势图2025最新版

    SOL币经历2021年DeFi与NFT热潮推动价格涨至$259.96,2022年因FTX暴雷跌至$8,2023-2024年生态复苏带动价格回升至$208,2025年在ETF获批预期下突破历史高点至$295.40,当前处于震荡蓄力阶段,多头主导市场。 binance币安交易所 注册入口: APP下载:…

    2025年12月11日
    000
  • 对于DeFi领域,Uniswap和PancakeSwap哪个更具潜力

    Uniswap以1.1兆美元年交易量和39.3亿美元TVL领先,凭借V3/V4技术创新提升资本效率与跨链能力;PancakeSwap依托BSC低成本高吞吐优势,通过多样化功能如IFO、NFT和单边质押吸引用户,周交易量占比达29.18%,TVL达16.7亿美元,但面临多链竞争压力。 一、评估交易量与…

    2025年12月11日
    000
  • 实时加密深度分析平台盘点?3款开源数据源

    CryptoWatch开源接口提供高频更新的全球交易所深度数据,支持多语言调用与可视化渲染;2. TradingView开源脚本集成Pine Script模板,可自定义订单簿深度分析并设置买卖压力警报;3. OpenBB Terminal支持本地部署,结合命令行拉取加密资产深度数据,实现技术指标叠加…

    2025年12月11日
    000
  • 以太坊(ETH)是什么?ETH价格走势、投资前景及购买渠道全解析

    以太坊(ETH)是继比特币之后全球第二大加密货币,其不仅是一种数字资产,更是智能合约与去中心化应用(DApp)的核心平台。本文将从 ETH 的基本概念、价格走势、投资前景及购买渠道全方位解析,帮助投资者更好地了解和操作。 以太坊简介 以太坊(Ethereum) 由 Vitalik Buterin 于…

    2025年12月11日
    000
  • ICO是什么_为什么参与者需要评估项目代币发行的实际价值

    评估ICO项目需从团队背景、白皮书质量、市场需求、代币模型及代码安全五方面入手,首先确认团队真实性和经验,再分析白皮书的技术可行性与创新性,继而考察市场空间与竞争格局,接着审视代币分配机制与实用价值,最后验证代码开源情况与第三方审计结果,以全面识别项目风险。 Binance币安 欧易OKX ️ Hu…

    2025年12月11日
    000
  • KAITO代币11月20日解锁835万枚,价值640万美元,占总流通量近3%

    据最新消息,KAITO代币将于 2025年11月20日 解锁约 835万枚,解锁市值约 640万美元,占当前总流通量近 3%。此次解锁将对市场流动性产生一定影响,投资者需关注交易策略和资金流向。 KAITO代币解锁影响分析 解锁事件可能导致市场短期波动: 市场供应增加:新增流通量可能短期压制价格,需…

    2025年12月11日
    000

发表回复

登录后才能评论
关注微信