Simulación de Horarios para Pruebas Unitarias en Python
Clase 13 de 20 • Curso de Unit Testing en Python
Resumen
En esta lección, hemos aprendido a modificar el comportamiento de objetos y funciones dentro de nuestras pruebas en Python, utilizando técnicas como el patch para simular situaciones específicas, como el control del horario de retiro en una cuenta bancaria. Esta habilidad es crucial cuando necesitamos validar restricciones temporales o cualquier otra lógica de negocio que dependa de factores externos, como el tiempo.
¿Cómo podemos restringir el horario de retiros en una cuenta bancaria?
Para implementar la restricción de horario, se utilizó la clase datetime
para obtener la hora actual. Definimos que los retiros solo pueden realizarse durante el horario de oficina: entre las 8 AM y las 5 PM. Cualquier intento fuera de este horario lanzará una excepción personalizada llamada WithdrawalError
.
- Se implementó la lógica en el método de retiro de la clase
BankAccount
. - La restricción se basa en comparar la hora actual obtenida con
datetime.now().hour
. - Si la hora es menor que las 8 AM o mayor que las 5 PM, se lanza la excepción.
¿Cómo podemos probar la funcionalidad de manera efectiva?
Las pruebas unitarias permiten simular diferentes horas del día para validar que las restricciones funcionen correctamente. Para lograrlo, usamos el decorador patch
del módulo unittest.mock
, el cual modifica temporalmente el comportamiento de la función datetime.now()
.
- Con
patch
, podemos definir un valor de retorno específico paranow()
, como las 7 AM o las 10 AM. - De esta forma, se puede validar que la excepción se lance correctamente si el retiro ocurre fuera del horario permitido.
- En caso de que el retiro sea dentro del horario, la prueba verificará que el saldo de la cuenta se actualice correctamente.
¿Cómo corregimos errores en la lógica de negocio?
Durante la implementación, encontramos un error en la condición lógica del horario. Inicialmente, se utilizó un operador and
incorrecto para verificar si la hora estaba dentro del rango permitido. Este error se corrigió cambiando la condición a un or
, asegurando que la lógica prohibiera retiros antes de las 8 AM y después de las 5 PM.