DEV Community

Cover image for How to mock Date with Jest

How to mock Date with Jest

Maxence Poutord on November 29, 2019

I spent too many hours trying to mock correctly the JavaScript's Date object. I tried a few things I've found on Google... without success. I final...
Collapse
 
clint profile image
clint

Thanks for sharing this--very helpful.

The approach described here worked well for me, but then I stumbled onto another option that uses Jest's own API (I don't believe was available when this post was originally written). You can now do something like this:

import { jest } from '@jest/globals';

// Tell Jest to use a different timer implementation. You can also
// configure this in your jest.config.js file. For more info see
// https://jestjs.io/docs/en/configuration#timers-string).
jest.useFakeTimers('modern');

jest.setSystemTime(new Date('04 Dec 1995 00:12:00 GMT').getTime());

console.log(new Date()); // "2014-01-09T00:00:00.000Z"

// Back to reality...
jest.useRealTimers();

console.log(new Date()); // prints the actual system time...
Enter fullscreen mode Exit fullscreen mode
Collapse
 
stanleysathler profile image
Stanley Sathler • Edited

Unfortunately jest.useFakeTimers seems to not work well with native Promises, which means you can't use it in an async call.

github.com/facebook/jest/issues/10221

Collapse
 
rafaelrozon profile image
Rafael Rozon

Thank you for this!

Collapse
 
maxpou profile image
Maxence Poutord

Thanks! That's true, it was added last may with Jest 26 :)

jestjs.io/blog/2020/05/05/jest-26

Collapse
 
abhishridwivedi profile image
AbhishriDwivedi

setSystemTime is giving error- setSystemTime does not exist on jest

Collapse
 
avalander profile image
Avalander • Edited

I just want to point out that both Date and RealDate reference the same object, so when you replace the function Date.now, it's also changing RealDate.now and your global.Date = RealDate at the end is not doing what you think it's doing.

What you should do if you want to keep and reassign the original now function is keep a reference to that function:

const realNow = Date.now

Date.now = () => 1000

Date.now = realNow
Enter fullscreen mode Exit fullscreen mode
Collapse
 
angelocicero profile image
Angelo Cicero

Very helpful!

Collapse
 
maxpou profile image
Maxence Poutord • Edited

🙊Oh! You're completely right! Thank you so much, I will update my post!!! :)

(sorry for the late answer, I didn't saw the notification...)

Collapse
 
ryandowd profile image
ryandowd

Great! Just what I was looking for!

Collapse
 
andrecrimberg profile image
André Crimberg

Thanks for the process.env.TZ = 'GMT' tip 🙏🏽

Collapse
 
vladqqqqoo profile image
Vladislav

Great job!
Thank you a lot, it really helped.