laravel怎么在测试中控制和伪造时间(Carbon::setTestNow)_laravel测试中Carbon时间控制方法
发布时间 - 2025-10-30 00:00:00 点击率:次使用 Carbon::setTestNow() 可固定测试时间,确保时间相关逻辑的测试稳定;例如设为 '2025-04-05 10:00:00' 后,所有 Carbon::now() 返回该值,便于断言;通过调整测试时间可模拟时间流逝,验证缓存过期等场景;测试结束应调用 Carbon::setTestNow(null) 清除设置,防止影响其他测试。
在 Laravel 测试中,经常需要验证与时间相关的逻辑,比如判断某个记录是否过期、任务是否可执行等。由于实际时间是动态变化的,直接使用 Carbon::now() 会导致测试不稳定或难以断言。为了解决这个问题,Laravel 借助 Carbon 提供了静态方法来“冻结”或“伪造”当前时间。
使用 Carbon::setTestNow() 固定测试时间
通过调用 Carbon::setTestNow(),你可以人为设定当前时间的返回值。之后所有对 Carbon::now() 的调用都会返回你指定的时间,直到你清除这个设置。
例如,在测试中:
use Carbon\Carbon;
public function test_something_happens_at_specific_time()
{
// 设定测试时间为 2025-04-05 10:00:00
Carbon::setTestNow('2025-04-05 10:00:00');
// 此时调用 now() 返回的是设定的时间
$this->assertEquals(
'2025-04-05 10:00:00',
Carbon::now()->format('Y-m-d H:i:s')
);
// 模拟业务逻辑,比如订单创建后两小时过期
$orderTime = Carbon::now();
$expireTime = $orderTime->copy()->addHours(2);
$this->assertFalse($expireTime->isPast()); // 还没过期
}
清除测试时间设置
每次使用 setTestNow(
) 后,建议在测试结束时清除设置,避免影响其他测试用例。可以使用 Carbon::setTestNow(null) 来恢复真实时间。
推荐在 tearDown() 或 afterEach 钩子中清理:
protected function tearDown(): void
{
Carbon::setTestNow(null); // 清除伪造时间
parent::tearDown();
}
在测试中模拟时间流逝
有时你需要验证“一段时间后”的行为,比如缓存失效、任务延迟执行等。可以在同一个测试中多次调整测试时间:
public function test_cache_expires_after_ten_minutes()
{
Carbon::setTestNow('2025-04-05 10:00:00');
cache()->put('key', 'value', 10); // 缓存10分钟
// 快进到 10 分钟后
Carbon::setTestNow(Carbon::now()->addMinutes(11));
$this->assertNull(cache()->get('key')); // 缓存已过期
}
基本上就这些。通过 Carbon::setTestNow(),你可以完全掌控测试中的时间流动,让时间相关逻辑的测试变得稳定且可预测。关键是在测试结束后记得清除设置,避免副作用。
# laravel
# app
# 2025
# carbon
# NULL
# 测试中
# 你可以
# 的是
# 是在
# 还没
# 设为
# 到你
# 时间为
# 可以使用
# 不稳定
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】
软银砸40亿美元收购DigitalBridge 强化AI资料中心布局
高防服务器租用指南:配置选择与快速部署攻略
深入理解Android中的xmlns:tools属性
香港服务器建站指南:免备案优势与SEO优化技巧全解析
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
*服务器网站为何频现安全漏洞?
网站建设要注意的标准 促进网站用户好感度!
Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践
Linux系统命令中tree命令详解
WEB开发之注册页面验证码倒计时代码的实现
制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?
长沙做网站要多少钱,长沙国安网络怎么样?
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
微信小程序制作网站有哪些,微信小程序需要做网站吗?
Laravel如何处理表单验证?(Requests代码示例)
Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤
Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】
教你用AI将一段旋律扩展成一首完整的曲子
个人摄影网站制作流程,摄影爱好者都去什么网站?
WordPress 子目录安装中正确处理脚本路径的完整指南
EditPlus中的正则表达式实战(5)
详解jQuery停止动画——stop()方法的使用
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】
如何彻底删除建站之星生成的Banner?
南京网站制作费用,南京远驱官方网站?
Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】
如何快速重置建站主机并恢复默认配置?
如何在Windows 2008云服务器安全搭建网站?
EditPlus中的正则表达式 实战(4)
Python3.6正式版新特性预览
香港服务器网站推广:SEO优化与外贸独立站搭建策略
Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】
Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】
免费网站制作appp,免费制作app哪个平台好?
网站制作软件有哪些,制图软件有哪些?
Java垃圾回收器的方法和原理总结
Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
深圳网站制作培训,深圳哪些招聘网站比较好?
如何用搬瓦工VPS快速搭建个人网站?
如何在VPS电脑上快速搭建网站?
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
Android利用动画实现背景逐渐变暗
Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
湖南网站制作公司,湖南上善若水科技有限公司做什么的?

