Tengo un método que depende de la new Date para crear un objeto de fecha y luego lo manipula. Estoy probando que la manipulación funciona como se esperaba, por lo que necesito comparar la fecha devuelta con la fecha esperada. Para hacer eso, necesito asegurarme de que la new Date devuelva el mismo valor en la prueba y en el método que se está probando. ¿Cómo puedo hacer eso?
¿Hay alguna manera de simular realmente el valor de retorno de una función constructora?
Podría crear un módulo que se requiera con una función que proporcione un objeto de fecha y se pueda burlar. Pero eso parece una abstracción innecesaria en mi código.
una función de ejemplo para ser probada...
module.exports = { sameTimeTomorrow: function(){ var dt = new Date(); dt.setDate(dt + 1); return dt; } }; ¿Cómo me burlo del valor de retorno de new Date() ?
Desde jest 26, puede usar la implementación 'moderna' de fakeTimers ( vea el artículo aquí ) que admite el método jest.setSystemTime .
beforeAll(() => { jest.useFakeTimers('modern'); jest.setSystemTime(new Date(2020, 3, 1)); }); afterAll(() => { jest.useRealTimers(); }); Tenga en cuenta que 'modern' será la implementación predeterminada de la versión 27 de jest.
Consulte la documentación de setSystemTime aquí .
Actualización : esta respuesta es el enfoque para jest < version 26 vea esta respuesta para las versiones recientes de jest .
Puede burlarse de un constructor como new Date() usando jest.spyOn como se muestra a continuación:
test('mocks a constructor like new Date()', () => { console.log('Normal: ', new Date().getTime()) const mockDate = new Date(1466424490000) const spy = jest .spyOn(global, 'Date') .mockImplementation(() => mockDate) console.log('Mocked: ', new Date().getTime()) spy.mockRestore() console.log('Restored: ', new Date().getTime()) })Y la salida se parece a:
Normal: 1566424897579 Mocked: 1466424490000 Restored: 1566424897608Consulte el proyecto de referencia en GitHub .
Nota: si está utilizando TypeScript y encuentra un error de compilación, el Argument of type '() => Date' is not assignable to parameter of type '() => string'. Type 'Date' is not assignable to type 'string' . En este caso, una solución alternativa es usar la biblioteca de fechas falsas , que se puede usar para cambiar cuándo es "ahora". Vea esta pregunta para más detalles.
Puede usar spyOn de jasmine (Jest está construido sobre jasmine) para simular el prototipo de Date para getDate de la siguiente manera:
spyOn(Date.prototype, 'setDate').and.returnValue(DATE_TO_TEST_WITH);SpyOn también se limpiará por sí mismo y solo durará el alcance de la prueba.