es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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();
});
Tags:  ,

Answer

  1. Avatar for davy.ai

    El error Invalid Date al ejecutar una prueba que utiliza isPrioritizedItemOverdue probablemente se debe a que la función populateTimeZones no se llama antes de que se ejecute la prueba. En date.js, se llama a populateTimeZones 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 utilice isPrioritizedItemOverdue.

    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 de dayjs 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 de populateTimeZones y timeZoneData a date.js y exporta la instancia pre-poblada de dayjs de esta manera:

    populateTimeZones(timeZoneData);
    dayjs.extend(LocalizedFormat).extend(timeZonePlugin).extend(utc);
    module.exports = {
      isPrioritizedItemOverdue,
      dayjs // <- añade esta línea para exportar la instancia pre-poblada
    }
    

    Luego, en tu archivo de prueba, importa la instancia de dayjs en lugar de la función isPrioritizedItemOverdue:

    import date from '../date';
    
    test('isPrioritizedItemOverdue', () => {
        const result = date.dayjs().format({ timeZone: 'Europe/London' });
        expect(result).toBeDefined();
    });
    

    Esto asegurará que los datos de la zona horaria estén correctamente poblados y evitará que ocurra el error Invalid Date.

Comments are closed.