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.

Cómo simular un objeto DateTime de Luxon en una prueba de Jest

No he encontrado mucha documentación sobre cómo probar el objeto DateTime de Luxon usando Jest. Me cuesta instanciar un objeto DateTime en mi prueba de Jest y siempre aparece como ‘indefinido’ cada vez que lo ejecuto. ¿Alguien podría demostrar una implementación de jest.mock() u otra manera de hacer que Jest simule DateTime para que pueda establecer un DateTime en mi prueba y hacer que pase?

Para contextualizar, el DateTime real (this.data.ApptDateTime) se establece en un lugar diferente en el código antes de que se llame a setLocalTimeZone(), por lo que ya está en formato DateTime de Luxon. El propósito de este código es asegurarse de que la fecha y la hora estén en la zona horaria local del usuario.

Este es un proyecto en Angular que utiliza Jest como marco de pruebas.

CÓDIGO:

import { DateTime } from 'luxon'

setLocalTimeZone() {
   const local = DateTime.local()

   // línea a continuación - aparece como indefinida en mi prueba de Jest
   this.data.ApptDateTime.setZone(local.zoneName)
}

PRUEBA DE JEST:

it('should schedule closing with success result', () => {
    component.data = new ScheduleClosingCreateModel({
      ApptDateTime: DateTime.local(2021, 8, 8, 20, 13, 700),
    })

// excepción lanzada porque apptDatetime es indefinido
component.setLocalTimeZone()

expect(component.data.ApptDateTime.zoneName).toEqual('America/New_York')
})

El error:
TypeError: No se puede leer la propiedad ‘setZone’ de undefined

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para simular el objeto DateTime de Luxon en Jest, puedes utilizar jest.mock() para crear un módulo falso para Luxon con una implementación falsa de DateTime.

    Aquí tienes un ejemplo de implementación:

    import { DateTime } from 'luxon';
    jest.mock('luxon', () => ({
      DateTime: jest.fn(),
    }));
    
    describe('setLocalTimeZone', () => {
      it('should set the timezone correctly', () => {
        const fakeLocalDateTime = { zoneName: 'America/New_York' };
        (DateTime as jest.Mock).mockImplementation(() => fakeLocalDateTime); // simular constructor de DateTime
    
        component.data = new ScheduleClosingCreateModel({
          ApptDateTime: DateTime.local(2021, 8, 8, 20, 13, 700),
        });
    
        component.setLocalTimeZone();
    
        expect(component.data.ApptDateTime.zoneName).toEqual('America/New_York');
      });
    });
    

    En este ejemplo, primero creamos un módulo falso para Luxon utilizando jest.mock. Dentro de la simulación, definimos una implementación falsa de DateTime, que devuelve un objeto con una propiedad zoneName establecida en America/New_York. Luego, utilizamos la función de Jest Mock para simular el constructor de DateTime con nuestra implementación falsa.

    Ahora, cuando se llama a DateTime.local() dentro de setLocalTimeZone(), devolverá nuestro objeto falso DateTime en lugar del objeto DateTime real de Luxon.

    Lo importante a tener en cuenta es que jest.mock() debe ser llamado antes de importar/requerir el código que se está probando. Esto asegura que se utilice el módulo simulado en lugar del real.

Comments are closed.