Jest 快照未能通过计算机时间戳(上午/下午)测试

问题描述 投票:0回答:3

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

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

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

我尝试了这种方法这个方法,但它根本没有改变输出:

let mockDate;

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

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

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

javascript reactjs jestjs snapshot
3个回答
1
投票

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

NODE_ICU_DATA=node_modules/full-icu jest 

您可以阅读描述该节点不支持区域设置的表格doc

请注意,

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


1
投票

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

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

1
投票

我们可以通过设置

TZ
环境变量来更改 CLI 中 Node.js 运行时的默认时区。有关更多详细信息,请参阅 Node.js CLI 文档

就我而言,我使用

cross-env
CLI 设置
TZ
环境变量:

...
"test": "cross-env TZ=UTC jest"
...
© www.soinside.com 2019 - 2024. All rights reserved.