Cuando escribo con lógica comercial, mi código a menudo depende de la hora actual. Por ejemplo, el algoritmo que examina cada orden pendiente y verifica si se debe enviar una factura (que depende del número de días desde que finalizó el trabajo). En estos casos, la creación de una factura no se desencadena por una acción explícita del usuario, sino por un trabajo en segundo plano.¿Cómo cambiar la fecha/hora en Python para todos los módulos?
Ahora bien, esto crea un problema para mí cuando se trata de pruebas:
- puedo prueba en sí misma creación de la factura fácil
- Sin embargo, es difícil crear un orden en una prueba y comprobar que el trabajo en segundo plano identifica los pedidos correctos en el momento correcto.
Hasta ahora he encontrado dos soluciones:
- En la configuración de la prueba, calcular las fechas de trabajo en relación con la fecha actual. Desventaja: el código se vuelve bastante complicado ya que no hay fechas explícitas escritas. En ocasiones, la lógica comercial es bastante compleja para los casos límite, por lo que es difícil realizar la depuración debido a todas estas fechas relativas.
- Tengo mis propias funciones de acceso de fecha/hora que utilizo a lo largo de mi código. En la prueba, simplemente establezco una fecha actual y todos los módulos obtienen esta fecha. De modo que puedo simular una creación de orden en febrero y verificar que la factura se cree en abril fácilmente. Desventaja: los módulos de terceros no usan este mecanismo, por lo que es realmente difícil integrarlos + probarlos.
El segundo enfoque fue mucho más exitoso para mí, después de todo. Por lo tanto, estoy buscando una manera de establecer el tiempo de regreso de los módulos datetime + time de Python. La configuración de la fecha suele ser suficiente, no es necesario configurar la hora o el segundo (aunque esto sería bueno).
¿Existe tal utilidad? ¿Hay una API (interna) de Python que pueda usar?
¿Qué versión de Python probé intente esto? Acabo de probar 2.6 en MacOS 10.6 y datetime.datetime.now() es felizmente inconsciente del cambio en time.time –
Malcolm, acabo de probar nuevamente en Python 2.7.1 en Windows, y funciona exactamente como se muestra arriba . Tal vez depende de la plataforma, lo que no sería del todo sorprendente, supongo. –
Probé esto en Ubuntu 12.04 con Python 2.7.3, y no funciona. Después de parchear mono 'time.time' con' mytime' como se describe, la llamada 'datetime.datetime.now' aún devuelve la hora actual. – djsmith