【问题标题】:Jest snapshot failing test on computer timestamp (AM/PM)对计算机时间戳 (AM/PM) 的 Jest 快照未通过测试
【发布时间】:2021-04-22 15:49:28
【问题描述】:

我有一个在日期和时间上失败的开玩笑测试,我认为这是因为运行它的用户的计算机设置不同。这是一个快照测试,它不是一个准确的失败,因为我们想要显示用户拥有的任何时区。

-             11:59:42 AM 7/26/2019
+             11:59:42 26/07/2019

在我的代码中,有一个 getTimeValue 用于使用 point.timestamp.toDate().toLocaleTimeString() 格式化日期时间。

我尝试了this approachthis one too,但它根本没有改变输出:

let mockDate;

beforeAll(() => {
  mockDate = jest.spyOn(Date.prototype, 'toLocaleTimeString').mockReturnValue('2020-04-15');
});

afterAll(() => {
  mockDate.mockRestore();
});

编辑:我意识到这个项目中已经有一个 globalsetup.ts 文件正在处理时区,所以问题实际上出在时间戳(AM、PM)和日期格式上。

【问题讨论】:

  • 您是否考虑过仅使用 date-fns 来设置时间格式的可配置和确定性方式?
  • @ChristianIvicevic 时间格式按照我想要的方式工作,但它只是让测试使用相同的语言环境和时间戳运行。

标签: javascript reactjs jestjs snapshot


【解决方案1】:

在节点(v12 及以下)运行 jest 时,它没有完整的本地化。您可能需要安装 full-icu 。 然后你可以在 package.json 中设置你的测试脚本,比如

NODE_ICU_DATA=node_modules/full-icu jest

您可以阅读该表,该表描述了它在此节点doc 上不支持区域设置

请注意,Node 14 它现在带有内置 ICU。因此,如果您的应用程序可以在 v14 上运行。使用 nvm 下载 v14 并尝试再次运行它。如果不去 full-icu 来模拟本地化支持

【讨论】:

  • 我正在运行节点 v15.14.0
  • 我更愿意在 globalconfig 中进行设置,或者不添加额外的库。我不知道为什么节点 15 不工作
【解决方案2】:

我最终只需要模拟出日期和时间函数。

     jest
       .spyOn(Date.prototype, 'toLocaleTimeString')
       .mockImplementation(() => '12:00:00');
     jest
       .spyOn(Date.prototype, 'toLocaleDateString')
       .mockImplementation(() => 'AM 1/01/2021');

【讨论】:

    【解决方案3】:

    您可以模拟Date
    如果您使用这种方法,您可以根据自己的需要对其进行完全定制。

    // jest.config.js
    {
      // ...
      setupFilesAfterEnv: [
        "./mocks/date.js"
      ]
    }
    
    // mocks/date.js
    class MockDate {
    ...
    }
    
    let RealDate;
    beforeAll(() => {
      RealDate = global.Date;
      global.Date = MockDate;
    });
    
    afterAll(() => {
      global.Date = RealDate;
    });
    

    【讨论】:

      猜你喜欢
      • 2022-01-19
      • 2021-12-29
      • 1970-01-01
      • 2020-05-23
      • 1970-01-01
      • 2018-05-19
      • 2012-02-18
      • 2018-04-09
      相关资源
      最近更新 更多