¿Cómo pruebas de forma fiable código que depende de la hora actual?
Opciones
- Ejecutar el test solo a una hora concreta del día
- Inyectar un reloj, o congelar el tiempo con freezegun (Opción correcta)
- Añadir llamadas a
time.sleepdentro del test - Omitir esos tests cuando dependen del reloj
Respuesta
Inyectar un reloj (o una función now) como dependencia, o congelar el tiempo con una librería como freezegun / time-machine
Por qué
El código que llama a datetime.now() por dentro da resultados distintos en cada ejecución, así que los tests no pueden predecirlo (y pueden fallar a medianoche o a fin de mes).
Pasa la fuente de tiempo como parámetro, por ejemplo is_expired(token, now), para que los tests den una fecha fija. O congela el tiempo en el test con freezegun.
La misma idea se aplica a números aleatorios e IDs.
Recuerda
El tiempo es una dependencia: inyéctalo o congélalo.