Simulación de Horarios para Pruebas Unitarias en Python

Clase 13 de 20Curso 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 para now(), 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.