laravel怎么在测试中控制和伪造时间(Carbon::setTestNow)_laravel测试中Carbon时间控制方法

2025-11-04 0 396

使用 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) 来恢复真实时间。

面试猫

AI面试助手,在线面试神器,助你轻松拿Offer

laravel怎么在测试中控制和伪造时间(Carbon::setTestNow)_laravel测试中Carbon时间控制方法
39
查看详情

推荐在 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怎么在测试中控制和伪造时间(Carbon::setTestNow)_laravel测试中Carbon时间控制方法的详细内容,更多请关注php中文网其它相关文章!

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

遇见资源网 php框架 laravel怎么在测试中控制和伪造时间(Carbon::setTestNow)_laravel测试中Carbon时间控制方法 https://www.ox520.com/1930.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务