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

Typescript 中使用Jest测试时如何自定义返回固定日期完成断言

实现方案

先修正原有代码的语法问题,再根据你的场景选择对应实现方式:


方案1:直接传入固定日期参数(可控入参场景首选)

如果你可以直接控制service.report的入参,直接把activeFrom替换为目标固定值即可:

it('reports fix date', async () => {
  const fixedActiveFrom = '2020-04-19T10:01:58.135Z';
  aService.returnValue = [{ 
     activeFrom: fixedActiveFrom
  }];

  const somethingSpy = jest.spyOn(PubSub, 'topic');

  await service.report([ 
    {
      activeFrom: new Date(fixedActiveFrom), // 直接传入固定日期
    }
  ]);
  expect(somethingSpy).toHaveBeenCalledWith(
    expect.objectContaining({ 
        activeFrom: fixedActiveFrom
    })    
  );
  // 测试完成后恢复spy,避免影响其他用例
  somethingSpy.mockRestore();
});

方案2:Mock全局时间固定Date返回(内部生成日期场景)

如果activeFrom是在service.report内部生成、你无法直接控制入参,可以用jest的假定时器固定全局系统时间:

it('reports fix date', async () => {
  const fixedActiveFrom = '2020-04-19T10:01:58.135Z';
  // 固定全局当前时间为指定日期,之后所有new Date()调用都会返回这个时间
  jest.useFakeTimers().setSystemTime(new Date(fixedActiveFrom));
  aService.returnValue = [{ 
     activeFrom: fixedActiveFrom
  }];

  const somethingSpy = jest.spyOn(PubSub, 'topic');

  await service.report([ 
    {
      // 此时addDays基于固定的系统时间计算,返回值永远固定
      activeFrom: addDays(new Date(), 30),
    }
  ]);
  expect(somethingSpy).toHaveBeenCalledWith(
    expect.objectContaining({ 
        activeFrom: fixedActiveFrom
    })    
  );
  // 测试完成后恢复定时器和spy,避免影响其他用例
  jest.useRealTimers();
  somethingSpy.mockRestore();
});

补充说明

如果你需要校验的是日期对象而非字符串,把期望中的fixedActiveFrom替换为new Date(fixedActiveFrom)即可,jest会自动比对日期的时间戳是否一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 15:54:04