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
相关产品推荐
相关产品推荐

