dayjs devolviendo “Fecha no válida” al usar timeZone en una prueba Jest
Tengo este archivo date.js
que contiene una función de fecha llamada isPrioritizedItemOverdue
:
const dayjs = require('dayjs');
const utc = require('dayjs/plugin/utc');
const timeZonePlugin = require('dayjs-ext/plugin/timeZone-custom');
const { populateTimeZones } = require('timezone-support/dist/lookup-convert');
const timeZoneData = require('./custom-data-2000-2032');
const LocalizedFormat = require('dayjs/plugin/localizedFormat');
const func = require('./func');
require('dayjs/locale/en-gb');
require('dayjs/locale/fr');
populateTimeZones(timeZoneData);
dayjs.extend(LocalizedFormat).extend(timeZonePlugin).extend(utc);
const isPrioritizedItemOverdue = ({ date, userTimezone }) => {
if (date) {
const todayInTimezone = dayjs().format({ timeZone: userTimezone });
const startOfTodayInUtc = dayjs(
`${todayInTimezone.substr(0, 10)}T00:00:00.000`)
.utc()
.toDate();
const targetDateInUtc = dayjs(date).utc().toDate();
return startOfTodayInUtc > targetDateInUtc;
}
return false;
};
module.exports = {
isPrioritizedItemOverdue,
}
La función isPrioritizedItemOverdue
funciona bien en la aplicación, pero cuando ejecuto una prueba que la utiliza, obtengo Invalid Date
devuelto por dayjs().format({ timeZone: userTimezone })
:
import date from '../date';
test('isPrioritizedItemOverdue', () => {
const result = date.isPrioritizedItemOverdue({
date: '2022-01-01T00:00:00.000Z',
userTimezone: 'Europe/London'
});
expect(result).toBeTruthy();
});
davy.ai
El error
Invalid Date
al ejecutar una prueba que utilizaisPrioritizedItemOverdue
probablemente se debe a que la funciónpopulateTimeZones
no se llama antes de que se ejecute la prueba. Endate.js
, se llama apopulateTimeZones
para poblar los datos de la zona horaria, por lo que es necesario asegurarse de que esta función se llame antes de ejecutar cualquier prueba que utiliceisPrioritizedItemOverdue
.Para solucionar este problema, puedes agregar la siguiente línea al principio de tu archivo de prueba, antes de que se ejecuten las pruebas:
const timeZoneData = require('./custom-data-2000-2032'); populateTimeZones(timeZoneData);
Esto asegura que las zonas horarias estén correctamente pobladas antes de ejecutar las pruebas que utilizan
isPrioritizedItemOverdue
.Alternativamente, puedes modificar
date.js
para que exporte la instancia dedayjs
con los datos de la zona horaria ya poblados, e importar esta instancia en tu archivo de prueba. Para hacer esto, simplemente mueve el código depopulateTimeZones
ytimeZoneData
adate.js
y exporta la instancia pre-poblada dedayjs
de esta manera:Luego, en tu archivo de prueba, importa la instancia de
dayjs
en lugar de la funciónisPrioritizedItemOverdue
:Esto asegurará que los datos de la zona horaria estén correctamente poblados y evitará que ocurra el error
Invalid Date
.