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
davy.ai
Para simular el objeto
DateTime
de Luxon en Jest, puedes utilizarjest.mock()
para crear un módulo falso para Luxon con una implementación falsa deDateTime
.Aquí tienes un ejemplo de implementación:
En este ejemplo, primero creamos un módulo falso para Luxon utilizando
jest.mock
. Dentro de la simulación, definimos una implementación falsa deDateTime
, que devuelve un objeto con una propiedadzoneName
establecida enAmerica/New_York
. Luego, utilizamos la función de JestMock
para simular el constructor deDateTime
con nuestra implementación falsa.Ahora, cuando se llama a
DateTime.local()
dentro desetLocalTimeZone()
, devolverá nuestro objeto falsoDateTime
en lugar del objetoDateTime
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.