冻结时间:测试Laravel临时存储URL

冻结时间:测试laravel临时存储url

上一篇文章探讨了两种测试Laravel Storage::temporaryUrl() 方法的技术。文章演示了如何使用模拟来处理本地不支持临时URL的情况。本文将深入探讨如何利用“冻结时间”技术提升测试临时URL的可靠性,尤其针对时间敏感型功能。我们将结合Laravel内置的测试助手和Carbon的时间操纵功能,解决测试中可能出现的时间不一致问题。

为什么“冻结时间”至关重要

临时URL通常包含过期时间戳,使其对时间敏感。测试环境中细微的执行延迟可能导致过期时间不匹配,从而导致测试失败。例如:

failed asserting that two strings are equal.expected :'http://localhost/test/image?expiration=1737729799'actual   :'http://localhost/test/image?expiration=1737729800'

这种差异源于测试执行过程中,时间流逝导致生成的过期时间戳略有不同。“冻结时间”确保所有与时间相关的操作都返回一致的值,从而消除此类差异。

Laravel的时间冻结助手

Laravel提供多种在测试中冻结和操纵时间的方法:

$this->freezeTime():将时间冻结在当前时刻。后续所有基于时间的方法都将使用此冻结时间。$this->travelTo(Carbon::now()):模拟跳转到特定时间点。Carbon::setTestNow(Carbon::now()):直接设置所有Carbon操作的当前时间。

这些方法允许精确控制时间流,确保测试的一致性。更多细节,请参考Laravel测试文档中关于“冻结时间”的部分。

实际示例:使用临时URL获取外部图像

以下是一个控制器方法,从外部源获取图像,将其存储在本地存储中,并生成临时URL进行重定向:

final class ExternalImageTmController extends Controller{    public function show(string $path): RedirectResponse    {        $path = str_replace('-', '/', trim($path));        if (!Storage::disk(StorageDiskName::DO_S3_TEHNOMIR_PRODUCT_IMAGE->value)->exists($path)) {            $externalUrl = implode('/', [config('services.tehnomir.s3_image_url'), $path]);            $response = Http::get($externalUrl);            if (!$response->successful()) {                throw new ItemNotFoundException('external image', [$path]);            }            Storage::disk(StorageDiskName::DO_S3_TEHNOMIR_PRODUCT_IMAGE->value)->put($path, $response->body());        }        return redirect()->away(            Storage::disk(StorageDiskName::DO_S3_TEHNOMIR_PRODUCT_IMAGE->value)->temporaryUrl($path, Carbon::now()->addHour())        );    }}

此方法确保图像在不存在的情况下被获取并存储,然后用户被重定向到图像的临时URL。

测试控制器

以下是如何使用“冻结时间”测试上述功能:

public function test_image_is_fetched_externally_stored_and_redirected(): void{    // Arrange    $user = $this->getDefaultUser();    $this->actingAsFrontendUser($user);    $this->freezeTime(); // 冻结时间    $path = 'test/image';    $disk = Storage::fake(StorageDiskName::DO_S3_TEHNOMIR_PRODUCT_IMAGE->value);    $externalUrl = config('services.tehnomir.s3_image_url') . '/' . $path;    Http::fake([        $externalUrl => Http::response('external-image-content'),    ]);    $disk->assertMissing($path); // 断言文件不存在    // Act    $response = $this->getJson(route('api-v2:external.images.tm.show', ['path' => 'test-image']));    // Assert    $disk->assertExists($path); // 断言文件存在    $this->assertEquals('external-image-content', $disk->get($path));    $temporaryUrl = $disk->temporaryUrl($path, Carbon::now()->addHour());    $response->assertRedirect($temporaryUrl);}

要点:

$this->freezeTime():确保所有基于时间的操作都使用相同的冻结时间。Storage 断言:assertMissing 验证操作前文件不存在;assertExists 验证操作后文件存在。Http::fake():模拟外部API调用以获取图像。临时URL验证:比较预期和实际的临时URL,由于时间冻结,它们保持一致。 没有冻结时间,则可能因时间戳不匹配而失败。

结论

“冻结时间”是一种简单而有效的方法,可确保时间敏感型测试的可靠性。结合Laravel测试助手和Carbon的时间操纵方法,可以消除执行延迟造成的不一致性,从而编写更可预测、更可靠的测试。

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

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月10日 00:11:04
下一篇 2025年12月10日 00:11:18

相关推荐

  • MySQL中“⺮”和“竹”为何被视为同一字符?

    MySQL数据库中“⺮”和“竹”字符混淆的原因及解决方法 在MySQL数据库进行文本搜索时,用户可能会发现“⺮”和“竹”这两个字被系统识别为同一个字符。这是由于MySQL的字符集和排序规则导致的。 根本原因在于MySQL使用的字符集及其对应的排序规则。不同的排序规则对字符的排序方式有所不同。“⺮”和…

    2025年12月10日
    000
  • 如何高效实现批量用户消息通知?

    高效处理海量用户消息通知的最佳实践 在许多应用场景中,例如直播平台或活动报名系统,都需要向大量用户发送批量消息通知。如何快速、高效地完成这一任务是关键。 一种行之有效的方案是利用消息队列技术。将待发送的消息放入队列(例如Redis队列),然后使用多个进程或脚本并发地消费队列中的消息。 这种方法利用了…

    2025年12月10日
    000
  • 如何高效批量发送消息通知给特定用户群?

    直播间及活动平台消息通知的异步处理方案 许多应用场景,如直播开播通知或活动开始提醒,都需要向特定用户群批量发送消息。为高效处理此类任务,建议采用异步消息队列机制。 具体实现步骤如下: 将待发送的消息任务添加到消息队列中。多个消费者进程持续从队列中获取并处理任务。消费者进程根据任务中指定的用户ID,定…

    2025年12月10日
    000
  • 如何避免PHP-PDO操作MySQL时关键字冲突?

    巧妙规避PHP-PDO操作MySQL关键字冲突 在使用PHP-PDO操作MySQL数据库时,难免会遇到表名或字段名与MySQL关键字冲突的情况。这时,需要用反引号(`)将这些名称括起来。本文将探讨如何避免手动添加反引号的繁琐操作。 PDO的局限性 遗憾的是,PDO本身并不具备自动转义关键字的功能。P…

    2025年12月10日
    000
  • Nginx跨域配置:为什么非200状态码下CORS头部信息不生效?

    Nginx跨域配置与HTTP状态码的关联性 在配置Nginx处理跨域请求时,常常会遇到一个问题:当HTTP状态码非200时,CORS头部信息无法生效。 以下是一个常见的Nginx跨域配置示例,以及它存在的问题: server { … add_header access-control-allow…

    2025年12月10日
    000
  • 如何高效解决大规模推送通知的挑战?

    攻克海量推送通知难题 直播平台或活动报名平台经常面临向大量用户发送通知的挑战,这主要体现在以下几个方面: 超高发送量:顶级主播的粉丝数量可能高达百万,需要处理的通知数量极其庞大。实时性要求高:通知必须在活动开始或直播前及时送达用户。杜绝重复发送:确保每位用户仅收到一条通知。 消息队列:高效解决方案 …

    2025年12月10日
    000
  • PHP新手如何搭建第一个原生网站?

    从零开始构建你的第一个PHP原生网站 对于PHP初学者来说,独立搭建网站可能让人望而却步。本指南将提供一个清晰的路径,助你顺利开启Web编程之旅。 学习资源推荐 为了快速上手,建议结合以下资源: 立即学习“PHP免费学习笔记(深入)”; 视频教程: 在B站搜索“ThinkPHP快速入门”,学习使用框…

    2025年12月10日
    000
  • 如何高效实现批量发送消息通知?

    高效处理海量消息通知 许多应用场景都需要在特定时间点向大量用户发送消息通知。关键在于快速、可靠地将通知传递给目标用户群体。 一种行之有效的方法是利用消息队列和多进程并发处理。 例如,大型直播平台需要在主播开播时通知所有订阅用户。假设有百万粉丝,则需要发送百万条通知。我们可以将这些通知放入例如Redi…

    2025年12月10日
    000
  • MySQL中如何用正则表达式替换指定字符串及之后文本?

    MySQL中如何利用正则表达式替换特定字符串及其后续文本 本文介绍如何在MySQL数据库中使用正则表达式替换指定字符串及其后的所有内容。 假设您的表字段包含如下数据: 123@&baidugoogle@&sohu 目标是移除所有以”@&”开头的字符串及…

    2025年12月10日
    000
  • 如何高效实现批量消息通知?

    高效实现批量消息通知的最佳实践 许多应用场景,例如直播平台的开播提醒或活动报名平台的通知,都需要向大量用户发送批量消息。为了满足快速、高效的需求,建议采用消息队列系统。 例如,可以使用Redis队列存储待发送的消息。然后,编写一个消息消费者脚本,并利用Supervisor管理多个并行运行的消费者进程…

    2025年12月10日
    000
  • PHP-PDO操作MySQL时如何处理关键字问题?

    巧妙应对PHP-PDO操作MySQL中的关键字冲突 在使用PHP-PDO操作MySQL数据库时,如果遇到表名或字段名与MySQL关键字冲突的情况,需要采取措施避免错误。 这篇文章将介绍如何有效处理这类问题。 解决方法 PHP-PDO本身并不提供自动处理关键字的功能。因此,我们通常采用以下两种方法: …

    2025年12月10日
    000
  • PHP-PDO操作MySQL时如何处理数据库关键字?

    巧妙应对PHP-PDO操作MySQL数据库关键字冲突 在使用PHP-PDO操作MySQL数据库时,经常会遇到表名或字段名与MySQL关键字冲突的问题。为了避免这类问题,通常需要使用反引号(`)将关键字括起来。那么,PHP-PDO是否提供自动处理关键字冲突的功能呢? 解决方法: 遗憾的是,PDO自身并…

    2025年12月10日
    000
  • Laravel项目中Nginx跨域配置失效:缺少always关键字如何解决?

    Nginx跨域配置失效:always关键字缺失的解决方案 在Laravel项目中进行跨域开发时,您可能遇到过这种情况:在Nginx中添加了跨域响应头,但接口响应中仍然缺少这些头信息。 问题分析及解决方法 您的Nginx配置可能类似如下: location / { add_header access-…

    2025年12月10日
    000
  • PHP语法基础到原生PHP网站开发:如何循序渐进地构建我的第一个网站?

    从PHP语法基础到原生PHP网站开发:循序渐进构建你的第一个网站 掌握PHP语法基础后,跃升至原生PHP网站开发是许多开发者的目标。然而,这需要清晰的规划和步骤。 学习资源:视频与代码示例 高效学习的关键在于结合视频教程和实际代码练习: 立即学习“PHP免费学习笔记(深入)”; 推荐视频教程: bi…

    2025年12月10日
    000
  • PHP SOAP请求:如何使用PHP发送SOAP请求并处理错误?

    利用PHP高效发送SOAP请求及错误处理 本文将指导您如何使用PHP发送SOAP请求并有效处理可能出现的错误。 代码示例:获取SOAP函数和类型列表 以下代码演示如何获取SOAP服务的函数和类型列表: 立即学习“PHP免费学习笔记(深入)”; $wsdl = “https://www.xxx.com…

    2025年12月10日
    000
  • PHP SOAP请求:如何使用PHP发送和接收SOAP数据?

    PHP SOAP客户端:发送和接收SOAP数据 本文介绍如何使用PHP创建SOAP客户端,发送SOAP请求并处理响应数据。 一、创建SOAP客户端 首先,使用SoapClient类创建一个SOAP客户端对象。需要提供WSDL文件的URL: 立即学习“PHP免费学习笔记(深入)”; $wsdl = “…

    2025年12月10日
    000
  • PHP-PDO操作MySQL时如何避免关键字冲突?

    巧妙规避PHP-PDO操作MySQL时关键字冲突 在使用PHP-PDO操作MySQL数据库时,如果表名或字段名与MySQL关键字冲突(例如user),就需要用反引号(` `)将其括起来。但PDO本身并不具备自动添加反引号的功能,这该如何解决呢? 主要有两种方法: 手动添加反引号: 在编写SQL语句时…

    2025年12月10日
    000
  • 阿里云Redis无法使用订阅命令,怎么办?

    阿里云Redis订阅功能启用指南 在阿里云环境下使用PHP的Redis扩展时,您可能遇到订阅命令无法正常工作的情况。这是因为阿里云Redis实例默认禁用了订阅功能,出于安全考虑。 以下步骤将指导您如何启用该功能: 访问阿里云控制台: 登录您的阿里云账号,进入Redis实例管理页面。 选择目标实例: …

    2025年12月10日
    000
  • Nginx跨域响应头缺失:为什么我的配置无效?

    Nginx跨域配置失效?排查及修复指南 在使用Nginx配置跨域访问时,有时会出现配置生效的问题,导致客户端无法获取到预期的响应头。本文将分析一个常见的配置错误,并提供有效的解决方法。 问题分析: 以下Nginx跨域配置看似正确,却可能无法正常工作: add_header access-contro…

    2025年12月10日
    000
  • ThinkPHP的create()方法无需判断成功与否的原因是什么?

    ThinkPHP 的 create() 方法:为什么无需显式检查成功与否? ThinkPHP 的 create() 方法用于创建数据库记录,其内部机制简化了创建过程,无需开发者手动检查是否创建成功。 create() 方法的内部工作流程: 数据匹配与自动填充: create() 方法会自动将传入的数…

    2025年12月10日
    000

发表回复

登录后才能评论
关注微信