【问题标题】:NodeJS testing datetimes with different times of the day and timezoneNodeJS 用一天中的不同时间和时区测试日期时间
【发布时间】:2020-09-30 23:21:04
【问题描述】:

我有一种情况,将今天的日期放在 DB 中,我使用的是原版代码。

const todayCloseDate = new Date().toISOString().slice(0, 10);

这显然给我的时区 (CST) 带来了一个问题,即下午 5:00 之后的日期变为第二天的值。我将处理更改为包 data-fnsmoments.js 不是一个选项)。

const todayCloseDate = DF.format(new Date(), 'yyyy-MM-dd');

它按预期工作。我的问题是如何对这种变化进行单元测试?这将需要更改本地机器的系统时间,该机器在本地运行测试以及在任何将在 CI/CD 管道中运行测试的测试环境(它将是 CircleCI 和 Jenkins)。

是否会启动涵盖此类错误并确保修复的测试场景?我的测试运行者是 Jest。

【问题讨论】:

    标签: node.js unit-testing datetime jestjs


    【解决方案1】:

    为 Date(或 Random 类)编写单元测试时,您需要确保测试中的 Date 始终相同。一种方法是覆盖它的实现:

    jest.spyOn(global.Date, 'toISOString').mockReturnValue('2011-10-05T14:48:00.000Z')// whatever date suits you;
    

    然后为这个日期编写测试。

    【讨论】:

    • 它正在某个地方,但没有到我正在寻找的地步......我需要测试在toISOString() 将在第二天返回的一种情况下DF..... 将在当天返回同一小时
    【解决方案2】:

    实际上,将静态时区设置为@Heri Hehe Setiawan 将是您的解决方案。冻结时区后,您可以为测试提供一些日期边缘值。

    另一种方法可能是模拟 Date 构造函数和函数 Date.parse()Date.now()directly providing mock 或借助一些第三方组件,如 timezone-mock

    最后你可以参考new Date().getTimezoneOffset()来生成边缘值:

    const minuteAfterMidnightAtUTC = 
      new Date(
        new Date().setHours(
          0, -new Date().getTimezoneOffset() + 1, 0, 0
        )
      );
    

    但我们最好不要在单元测试中生成值 - 如果单元测试失败一次,可能很难重现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-16
      • 2019-11-08
      • 2014-01-11
      • 2014-11-10
      • 2020-10-19
      • 1970-01-01
      • 2021-10-17
      • 1970-01-01
      相关资源
      最近更新 更多