You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Jest模拟00:00-02:00时段验证时间类业务逻辑

问题原因

你之前的模拟代码jest.useFakeTimers("modern").setSystemTime(moment().startOf("day").add(3, "hour").toDate())本身就是把系统时间设到了当日凌晨3点,不在00:00-02:00的目标区间内,测试异常通过通常是两个原因:一是fake timer初始化时机不对,mock没有对业务逻辑里的时间读取生效;二是时间判断逻辑本身写反,区间外也错误返回了展示结果。

正确Mock实现步骤
  • 测试用例执行前初始化fake timer,Jest 27及以上版本默认使用modern模式的fake timer,不需要额外传"modern"参数,避免版本兼容问题
  • 精准设置系统时间到00:00-02:00区间内的典型值,比如1点30分,避开边界点减少判断歧义
  • 每个用例执行结束后还原真实计时器,避免时间mock污染其他测试用例
  • 补充反向校验用例,模拟02:00之后的时间点,验证提示不会错误展示

参考测试代码:

const moment = require('moment');

describe('昨日日期选择提示逻辑校验', () => {
  beforeEach(() => {
    // 每个用例执行前初始化假计时器
    jest.useFakeTimers();
  });

  afterEach(() => {
    // 每个用例执行后还原真实时间
    jest.useRealTimers();
  });

  test('当日00:00-02:00时段,选择昨日日期应展示提示', () => {
    // 模拟当前时间为当日01:30,属于目标展示时段
    const mockCurrentTime = moment().startOf('day').add(1.5, 'hours').toDate();
    jest.setSystemTime(mockCurrentTime);

    // 执行业务判断逻辑,传入选中值为昨日日期
    const isShowTip = checkYesterdayTipVisible(moment().subtract(1, 'day').toDate());
    expect(isShowTip).toBe(true);
  });

  test('当日02:00之后时段,选择昨日日期不应展示提示', () => {
    // 模拟当前时间为当日03:00,属于非展示时段
    const mockCurrentTime = moment().startOf('day').add(3, 'hours').toDate();
    jest.setSystemTime(mockCurrentTime);

    const isShowTip = checkYesterdayTipVisible(moment().subtract(1, 'day').toDate());
    expect(isShowTip).toBe(false);
  });
});
常见注意事项
  • 不要在describe代码块的最外层直接执行jest.setSystemTime,这部分代码会在测试文件加载阶段执行,可能被后续的mock逻辑覆盖,导致时间设置不生效
  • 校验业务逻辑的时间取值方式,不要混用本地时间和UTC时间:如果业务代码用getUTCHours()取小时值,mock时间时要对应换算时区偏移,否则时间判断会出现固定偏移
  • 边界场景单独校验:针对00:00整、02:00整两个临界点,要和产品规则对齐是否属于展示时段,单独写用例覆盖

内容的提问来源于stack exchange,提问作者frankfullstack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 22:54:30