javascript日期函数单元测试需隔离系统时间依赖,推荐显式传入now参数或用jest/sinon冻结时间,并在aftereach还原,覆盖相对计算、跨月、时区及异常输入等场景。

JavaScript 中对日期处理函数做单元测试,核心是隔离系统时间依赖,避免测试因真实时间变化而失败或不稳定。
用 sinon 或 Jest 模拟 Date 构造函数
日期处理函数常依赖 new Date() 或 Date.now(),直接调用会导致测试不可控。推荐在测试前“冻结”时间:
- Jest 用户可直接用
jest.useFakeTimers('modern')+jest.setSystemTime(1717027200000)(如设为 2024-05-31 00:00:00) - sinon 用户可用
sinon.useFakeTimers({ now: 1717027200000 }),并在afterEach中 restore - 注意:若函数内部调用了
new Date().toISOString()或.getFullYear()等方法,fake timers 同样生效
把时间参数显式传入函数(推荐设计)
比 monkey patch 更可靠的方式,是重构函数使其接受可选的 now 参数,默认值才是 new Date():
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
function getFormattedDate(now = new Date()) {
return now.toLocaleDateString('zh-CN', { year: 'numeric', month: '2-digit', day: '2-digit' });
}
这样测试时可传入固定日期实例,无需 mock:
expect(getFormattedDate(new Date('2023-01-01'))).toBe('2023-01-01')- 函数职责更清晰,便于复用和调试
- 也方便测试边界情况,比如闰年 2 月 29 日、时区切换日等
测试常见日期逻辑场景
除基础格式化,还要覆盖典型业务逻辑:
-
相对时间计算:如 “3 天后”、“上周一”,需验证结果日期是否正确(建议用
getTime()对比毫秒数) - 跨月/跨年处理:如 “本月最后一天”,测试 1 月 31 日、2 月 28 日等边界
-
时区敏感逻辑:若函数含
toLocaleString,明确指定时区(如{ timeZone: 'Asia/Shanghai' }),并在测试中固定时区或用 UTC 基准校验 -
无效输入防护:传入
null、undefined、非法字符串时,是否抛出预期错误或返回合理默认值
避免全局污染,每个测试独立清理
使用 fake timers 后务必还原真实时间,否则会影响后续测试:
- Jest:在
afterEach(() => jest.useRealTimers())或afterAll - sinon:保存 timer 实例,在
afterEach调用clock.restore() - 不推荐在测试文件顶部统一 fake —— 容易遗漏 restore,导致 CI 环境偶发失败
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










