admin管理员组文章数量:1201211
I have this codepiece in my React component, which renders an HTML in the end:
new Date(createDate).toLocaleDateString()
My local machine and our build machine have different locales set, so the result of this function is not coherent. So as you'd expect, the unit test passes on my machine and fails on build machine, or vice versa.
I want to mock "toLocalDateString" so that it always uses the same locale, say 'en-US', or at least it always returns the same string. Our test framework is jest. How do I achieve this goal?
I tried this in my test.spec.js but it didn't have any effect at all:
Date.prototype.toLocaleDateString = jest.fn().mockReturnValue('2020-04-15')
expect(component).toMatchSnapshot()
I still get the same old toLocalDateString implementation in the snapshot, my mockReturnValue is not taken into account.
I have this codepiece in my React component, which renders an HTML in the end:
new Date(createDate).toLocaleDateString()
My local machine and our build machine have different locales set, so the result of this function is not coherent. So as you'd expect, the unit test passes on my machine and fails on build machine, or vice versa.
I want to mock "toLocalDateString" so that it always uses the same locale, say 'en-US', or at least it always returns the same string. Our test framework is jest. How do I achieve this goal?
I tried this in my test.spec.js but it didn't have any effect at all:
Date.prototype.toLocaleDateString = jest.fn().mockReturnValue('2020-04-15')
expect(component).toMatchSnapshot()
I still get the same old toLocalDateString implementation in the snapshot, my mockReturnValue is not taken into account.
Share Improve this question edited Apr 15, 2020 at 9:36 skyboyer 23.7k7 gold badges61 silver badges71 bronze badges asked Apr 15, 2020 at 9:06 schlingelschlingel 1,6943 gold badges19 silver badges29 bronze badges5 Answers
Reset to default 8I may be a bit late but hope it helps someone
let mockDate;
beforeAll(() => {
mockDate = jest.spyOn(Date.prototype, 'toLocaleTimeString').mockReturnValue('2020-04-15');
});
afterAll(() => {
mockDate.mockRestore();
});
If you want to respond to the current date, but choose an alternative (fixed) locale I found this works pretty well. You can place it in the test file or in the setupTests.js/ts
file to apply it:
const origDate = global.Date.prototype.toLocaleDateString;
jest.spyOn(global.Date.prototype, 'toLocaleDateString').mockImplementation(function () {
return origDate.call(this, 'en-US');
});
This example will fix all localeDateString output to en-US
. Note you have to use function(){}
and not ()=>{}
because you're relying on this
to be set correctly by the caller.
Can you wrap
new Date(createDate).toLocaleDateString()
in a function, pass it as prop to component and then mock it?
I couldn't get Jamund Ferguson's answer to work with Vitest because their .spyOn
mechanism seems to be slightly different. However, by adding a new file to my setupFiles with the following code, I was able to get this working properly:
const origDate = Date.prototype.toLocaleDateString
beforeAll(() => {
// eslint-disable-next-line no-extend-native
Object.defineProperty(Date.prototype, 'toLocaleDateString', {
value() {
return origDate.call(this, 'en-AU')
},
})
})
afterAll(() => {
// eslint-disable-next-line no-extend-native
Object.defineProperty(Date.prototype, 'toLocaleDateString', {
value() {
return origDate.call(this)
},
})
})
Would the below code work well for you? I am mocking the date object this way.
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;
本文标签: javascriptHow do I mock DatetoLocaleDateString in jestStack Overflow
版权声明:本文标题:javascript - How do I mock Date.toLocaleDateString in jest? - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1738630025a2103690.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论