我如何在玩笑中模拟 Date.toLocaleDateString?

IT技术 javascript reactjs unit-testing jestjs
2021-05-12 19:35:51

我的 React 组件中有这个代码片段,它最终呈现一个 HTML:

new Date(createDate).toLocaleDateString()

我的本地机器和我们的构建机器设置了不同的语言环境,所以这个函数的结果是不连贯的。因此,正如您所期望的,单元测试在我的机器上通过并在构建机器上失败,反之亦然。

我想模拟“toLocalDateString”,以便它始终使用相同的语言环境,例如“en-US”,或者至少它始终返回相同的字符串。我们的测试框架是开玩笑的。我如何实现这个目标?

我在我的 test.spec.js 中尝试过这个,但它根本没有任何效果:

Date.prototype.toLocaleDateString = jest.fn().mockReturnValue('2020-04-15')
expect(component).toMatchSnapshot()

我仍然在快照中得到相同的旧 toLocalDateString 实现,我的 mockReturnValue 没有被考虑在内。

3个回答

我可能有点晚了,但希望它可以帮助某人

let mockDate;

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

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

你能包吗

new Date(createDate).toLocaleDateString()

在一个函数中,将它作为 prop 传递给组件然后模拟它?

下面的代码对你有用吗?我正在以这种方式嘲笑日期对象。

const realDateToLocaleDateString = Date.prototype.toLocaleDateString.bind(global.Date);
const toLocaleDateStringStub = jest.fn(() => '2020-04-15');
global.Date.prototype.toLocaleDateString = toLocaleDateStringStub;

const date = new Date();
console.log(date.toLocaleDateString()); // returns 2020-04-15

global.Date.prototype.toLocaleDateString = realDateToLocaleDateString;