DEV Community

Cover image for Mocking JavaScript's current Date in Jest tests
Hugo Di Francesco
Hugo Di Francesco

Posted on • Originally published at codewithhugo.com on

Mocking JavaScript's current Date in Jest tests

There are situations where Date.now is used in application code. That code needs to be tested, and it’s always a struggle to remember how to mock Date.now. Here is the magic snippet:

const literallyJustDateNow = () => Date.now();

test('It should call and return Date.now()', () => {
  const realDateNow = Date.now.bind(global.Date);
  const dateNowStub = jest.fn(() => 1530518207007);
  global.Date.now = dateNowStub;

  expect(literallyJustDateNow()).toBe(1530518207007);
  expect(dateNowStub).toHaveBeenCalled();

  global.Date.now = realDateNow;
});
Enter fullscreen mode Exit fullscreen mode

This was sent out on the Code with Hugo newsletter last Monday.
Subscribe to get the latest posts right in your inbox (before anyone else).

This isn’t really a Jest-specific trick, we’re just accessing Node global object and replace Date.now with a stub.
We’re also being good unit-testing citizens and putting the original global.Date.now implementation back 😇.

Cover photo by Bryce Barker on Unsplash.

Top comments (5)

Collapse
 
joelnet profile image
JavaScript Joel

You might run the risk of tests after this one failing if there is an exception in this test that prevents Date.now being set back.

Using beforeEach and after each could help with Code reuse and this possible scenario.

Collapse
 
patroza profile image
Patrick Roza

Wrap in try, finally. Alternatively create a utility function to create now date, and mock that

Collapse
 
pies profile image
Michał T.

Also great for mocking Math.random I imagine.

Collapse
 
borys_kupar profile image
Borys Kupar

How can you mock date constructor?
So imagine date is created with "const now = new Date()".
I would like to have "now" to have specific mocked date.

Collapse
 
hugo__df profile image
Hugo Di Francesco

global.Date = myMockConstructor