JavaScript日期测试核心是冻结系统时间并显式传参:用jest或sinon冻结Date,函数接收可选date参数,UTC计算相对时间,避免toLocaleString等环境依赖方法。

JavaScript 中测试日期时间逻辑,核心是避免依赖真实系统时间,通过可控的“时间快照”让测试可重复、稳定。下面从几个关键点展开。
用 sinon 或 jest 模拟 Date 构造函数
直接 new Date() 会返回当前时间,导致测试结果随运行时刻变化。推荐用测试工具冻结时间:
-
jest:使用
jest.useFakeTimers('modern')+jest.setSystemTime(1717027200000)(如设为 2024-05-31 00:00:00 UTC) -
sinon:调用
sinon.useFakeTimers({ now: 1717027200000 }),测试结束后记得.restore() - 注意:fake timers 对
Date.now()、new Date()、setTimeout等都生效,但不修改performance.now()
测试带时区或格式化逻辑时,显式传入时间参数
不要在函数内部直接调用 new Date(),改为接受可选的 date 参数(默认为当前时间),便于测试不同场景:
function getFormattedDay(date = new Date()) {
return date.toLocaleDateString('zh-CN', { weekday: 'long' });
}
// 测试时传入固定日期
expect(getFormattedDay(new Date('2024-01-01'))).toBe('星期一');
这样既保持运行时默认行为,又让单元测试能精准控制输入。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
验证相对时间计算(如“3天后”、“上周一”)要检查边界和时区偏移
这类逻辑容易因本地时区或 DST(夏令时)出错。建议:
- 用
UTC时间做基准计算(如new Date(Date.UTC(2024, 0, 1))),避免本地时区干扰 - 对“X 天后”类逻辑,用毫秒加减并重新构造 Date,比用
setDate()更可靠(后者可能跨月异常) - 测试临界值:如 12 月 31 日 +1 天 → 下一年 1 月 1 日;2 月 28 日(闰年/平年)+1 天
慎用 toLocaleString 等本地化方法做断言
不同系统、Node.js 版本、甚至 CI 环境的 locale 设置可能不同,导致 toLocaleDateString() 输出不一致。替代方案:
- 用
Intl.DateTimeFormat显式指定 locale 和 options,并在测试中固定它 - 对格式要求严格的场景,改用
date.getFullYear() + '-' + String(date.getMonth()+1).padStart(2,'0')...手动拼接 - 或者用成熟库如
date-fns的format函数(它不依赖环境 locale)
不复杂但容易忽略:只要不让测试代码读取实时时间,再复杂的日期逻辑也能写出稳定可靠的单元测试。

















