如何在Deno中实现类似jest的Date对象Mock功能?
在Deno中Mock全局Date对象的实现方法
你可以直接操作globalThis(Deno的全局对象)来替换Date构造函数,实现类似jest.spyOn的效果,无需依赖第三方库,具体实现如下:
基础实现方案
先保存原始的Date构造函数,再自定义mock版本覆盖全局对象,测试完成后恢复原始实现:
// 保存原始Date构造函数 const originalDate = globalThis.Date; // 定义要固定的mock时间 const mockNow = new Date('2023-01-01T00:00:00Z'); // 替换全局Date globalThis.Date = class extends originalDate { constructor(...args: any[]) { // 无参数调用new Date()时返回mock时间 if (args.length === 0) { super(mockNow); } else { // 带参数时仍使用原始逻辑 super(...args); } } // 同时mock静态方法Date.now() static now() { return mockNow.getTime(); } } as typeof originalDate; // 测试验证 console.log(new Date()); // 输出: 2023-01-01T00:00:00.000Z console.log(Date.now()); // 输出对应mock时间的时间戳 // 测试完成后恢复原始Date globalThis.Date = originalDate;
封装成工具函数(类似jest.spyOn风格)
如果需要在多个测试用例中复用,可以封装成工具函数,返回恢复函数方便清理:
function spyOnGlobalDate(mockDate: Date) { const originalDate = globalThis.Date; const mockDateClass = class extends originalDate { constructor(...args: any[]) { args.length === 0 ? super(mockDate) : super(...args); } static now() { return mockDate.getTime(); } } as typeof originalDate; globalThis.Date = mockDateClass; // 返回恢复函数,用于测试后清理 return () => { globalThis.Date = originalDate; }; } // 使用示例 const restoreDate = spyOnGlobalDate(new Date('2023-06-01T12:00:00Z')); // 执行测试逻辑 // ... // 测试结束后恢复原始Date restoreDate();
补充说明
官方的mock模块和第三方时间mock库通常更专注于定时器(如setTimeout、setInterval)的控制,而全局Date的替换直接操作globalThis是最直接的方案,完全自定义逻辑,能覆盖new Date()和Date.now()的所有场景。
内容的提问来源于stack exchange,提问作者Ataxote
相关产品推荐
相关产品推荐

