You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 15:08:25