如何使用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
相关产品推荐
相关产品推荐

