在计算机时间戳(AM/PM)上进行Jest快照失败测试



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

-             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(和日期格式。

在节点(v12及以下版本(上运行jest时,它没有完全本地化。您可能需要安装完整的icu。然后你可以在package.json上用之类的东西设置测试脚本

NODE_ICU_DATA=node_modules/full-icu jest

您可以阅读该表,该表描述该节点文档不支持区域设置

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

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

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

您可以模拟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;
});

最新更新