将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
javascript单元测试中mock时间的核心是拦截替换date构造函数或方法;推荐用sinon的usefaketimers或jest内置faketimers,手动覆盖需谨慎并及时恢复。

在 JavaScript 单元测试中,固定 Date 对象的返回值(即“Mock 时间”)是确保时间敏感逻辑可重复、可预测的关键。核心思路是**拦截并替换全局 Date 构造函数或其方法**,让所有 new Date() 或 Date.now() 返回你指定的基准时间。
使用 Sinon.js 的 fakeTimers(推荐,尤其 Jest 外环境)
Sinon 提供了成熟、隔离性好的时间模拟机制,支持自动清理和精确控制:
- 调用
sinon.useFakeTimers(baseTime),其中baseTime可以是毫秒时间戳、Date实例或 ISO 字符串(如"2023-10-01T12:00:00Z") - 此后所有
new Date()、Date.now()、setTimeout等都基于该基准时间运行 - 测试结束后务必调用
clock.restore()恢复真实时间(Jest 中也可用afterEach统一清理)
示例:
const clock = sinon.useFakeTimers(new Date('2023-10-01T12:00:00Z'));<br>console.log(new Date().toISOString()); // "2023-10-01T12:00:00.000Z"<br>console.log(Date.now()); // 1696161600000<br>clock.restore(); // 必须恢复
Jest 内置 fakeTimers(最简洁,Jest 用户首选)
Jest 自带高性能时间模拟,配置简单且默认自动清理:
- 在测试文件顶部或
beforeEach中启用:jest.useFakeTimers(); - 设置基准时间:
jest.setSystemTime(new Date('2023-10-01T12:00:00Z')); - 无需手动 restore —— Jest 在每个测试后自动重置(除非显式调用
jest.useRealTimers())
注意:Jest 的 setSystemTime 仅影响 new Date() 和 Date.now(),不影响 setTimeout 等异步调度(那些需配合 advanceTimersByTime 控制)。
手动覆盖全局 Date(轻量、无依赖,适合简单场景)
若不想引入库,可直接重写 Date 构造函数和静态方法,但需谨慎处理原型链和 instanceof 行为:
- 保存原构造函数:
const RealDate = Date; - 定义固定时间戳:
const FIXED_TIMESTAMP = new RealDate('2023-10-01T12:00:00Z').getTime(); - 重写
Date:global.Date = class extends RealDate { constructor(...args) { return args.length === 0 ? super(FIXED_TIMESTAMP) : super(...args); } }; - 重写
Date.now:Date.now = () => FIXED_TIMESTAMP; - 测试后恢复:
global.Date = RealDate;
⚠️ 注意:此方式可能影响其他测试或工具(如某些 polyfill),建议仅在隔离环境(如单个 test block)中临时使用,并确保恢复。
关键提醒:避免常见陷阱
-
不要只 mock
Date.now而忽略new Date()—— 很多代码直接调用构造函数 - mock 后记得恢复,否则污染后续测试(Jest fakeTimers 默认安全,手动方案必须显式还原)
-
时区敏感逻辑要明确基准时间的时区 —— 推荐统一用 UTC 字符串(如
"2023-10-01T12:00:00Z")避免本地时区干扰 - 如果测试涉及
setTimeout/setInterval,需用jest.advanceTimersByTime()或clock.tick()推进虚拟时间










