Jest: Test Intl.datetimeformat
Solution 1:
The only solution that I managed to find to this problem was to install full-icu which seemed to provide the right locales to node during the testing process.
That package is needed because node by default only ships with a limited set of locales, explained here: https://nodejs.org/docs/latest-v9.x/api/intl.html
With that package installed, the additional step that I had to take was to change my test command to use:
"test": "NODE_ICU_DATA=node_modules/full-icu jest --config jest.config.js"
I ran into this problem in a couple of different environments. When running the tests locally on Mac OS and also when running the tests inside a Docker container during CI.
Interestingly, I don't need to use the export when running the tests via WebStorm's Jest integration. It definitely seems like the behaviour of the Intl library is far from stable in node.
Solution 2:
You can use polyfill, as described here
importIntlPolyfillfrom'intl';
import'intl/locale-data/jsonp/ru';
if (global.Intl) {
Intl.NumberFormat = IntlPolyfill.NumberFormat;
Intl.DateTimeFormat = IntlPolyfill.DateTimeFormat;
} else {
global.Intl = IntlPolyfill;
}
Solution 3:
Just found a solution if you want to change the zone per test.
The benefit here is minimal change to the Intl object since we are just using the normal api to set a default
const timezoneMock = function(zone: string) {
constDateTimeFormat = Intl.DateTimeFormat
jest
.spyOn(global.Intl, 'DateTimeFormat')
.mockImplementation((locale, options) =>newDateTimeFormat(locale, {...options, timeZone: zone}))
}
afterEach(() => {
jest.restoreAllMocks();
})
and then
describe('when Europe/London', () => {
it('returns local time', () => {
timezoneMock('Europe/London')
//etc....
Solution 4:
In package.json add the intl
package
"intl":"*",
In the jest.config.js
module.exports = {
moduleNameMapper: {
Intl: '<rootDir>/node_modules/intl/'
}
};
Then in Date.spec.js
describe(`Date by locale`, () => {
beforeAll(() => { global.Intl = require('intl'); });
// Add your tests here. // Add a temporary console.log to verify the correct output
}
Post a Comment for "Jest: Test Intl.datetimeformat"