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

Jest如何正确mock moment()返回指定日期且保留原有属性方法

解决方案

方案1:Mock moment 同时保留所有静态方法

你最早的写法只返回了自定义的构造函数,没有挂载moment自带的静态属性(比如duration、utc等),所以会导致这些方法无法调用,调整后的mock写法如下:

jest.mock("moment", () => {
  const originalMoment = jest.requireActual("moment");
  const mockMoment = (date) => {
    // 传参时使用传入的日期,无参时返回固定日期
    return originalMoment(date || "2021-01-01T00:00:00.000Z");
  };
  // 复制原moment的所有静态方法/属性到mock函数上
  Object.assign(mockMoment, originalMoment);
  return mockMoment;
});

方案2:修复 Mock Date.now 的写法

你之前直接赋值Date.now的写法漏写了末尾的闭合括号,导致语法错误,Date.now返回异常,moment就会生成无效日期。正确写法如下:

// 推荐使用spyOn,方便后续恢复原方法
const targetTime = new Date("2021-01-01T00:00:00.000Z").getTime();
jest.spyOn(Date, "now").mockReturnValue(targetTime);

// 直接赋值写法需保证语法正确
Date.now = jest.fn(() => new Date("2021-01-01T00:00:00.000Z").getTime());

注意事项

  • 测试用例执行完毕后要恢复mock,避免影响其他测试逻辑:
afterEach(() => {
  jest.restoreAllMocks();
});
  • 如果出现日期字符串兼容性问题,可以直接传入时间戳:new Date(2021, 0, 1, 0, 0, 0).getTime(),注意月份参数从0开始计数。

内容的提问来源于stack exchange,提问作者Tan Dat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 19:54:00