Components using Date objects produce different snapshots in different timezones
I ended up with a solution comprised of two parts.
Never create
Date
objects in tests in timezone-dependent manner. If you don't want to use timestamps directly to have readable test code, useDate.UTC
, e.g.new Date(Date.UTC(1995, 4, 23))
- Mock the date formatter used to turn
Date
s into display values, so that it returns a timezone-independent representation, e.g. useDate::toISOString()
. Fortunately this was easy in my case, as I just needed to mock theformatDate
function in my localization module. It might be harder if the component is somehow turningDate
s into strings on its own.
Before I arrived at the above solution, I tried to somehow change how the snapshots are created. It was ugly, because enzyme-to-json saves a local copy of toISOString()
, so I had to use _.cloneDeepWith
and modify all the Date
s. It didn't work out for me anyway, because my tests also contained cases of Date
creation from timestamps (the component is quite a bit more complicated than I described above) and interactions between those and the dates I was creating in the tests explicitly. So I first had to make sure all my date definitions were referring to the same timezone and the rest followed.
Update (11/3/2017): When I checked enzyme-to-json
recently, I haven't been able to find the local saving of toISOString()
, so maybe that's no longer an issue and it could be mocked. I haven't been able to find it in history either though, so maybe I just incorrectly noted which library did it. Test at your own peril :)
I struggled with this for hours/days and only this worked for me:
1) In your test:
Date.now = jest.fn(() => new Date(Date.UTC(2017, 7, 9, 8)).valueOf())
2) Then change the TZ
env var before running your tests.
So the script in my package.json:
(Mac & Linux only)
"test": "TZ=America/New_York react-scripts test --env=jsdom",
(Windows)
"test": "set TZ=America/New_York && react-scripts test --env=jsdom",