es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

prueba unitaria, simular time.sleep en otro paquete

Tengo un proyecto en Pycharm con código de paquetes bajo prueba y puedo importar el paquete como import my_package desde otro módulo en el proyecto, ya que Pycharm configura Python para incluir el directorio del proyecto en su ruta de búsqueda.
El módulo my_module en my_package importa time y usa time.sleep, lo cual quiero simular.

projectdir/mi_paquete
  __init__.py
  mi_modulo.py

projectdir/tests
  test_mi_paquete.py

En el test tengo el siguiente código:

import unittest
from unittest.mock import patch

from mi_paquete import mi_modulo

@patch("mi_paquete.mi_modulo.time.sleep")
class TestMiPaquete(unittest.TestCase):
    def test_bla(self, timepatch):
        mi_modulo.mi_funcion()

El problema que tengo es que el método time.sleep no se simula. Mis pruebas unitarias tardan alrededor de 0.5 segundos por cada caso de prueba, lo cual es demasiado. Supongo que estoy simulando en el lugar equivocado.
¿Puedes ayudarme a corregir el decorador @patch("my_package.my_module.time.sleep")?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema con el decorador @patch ("my_package.my_module.time.sleep") es que está intentando parchear el atributo sleep del módulo time en el espacio de nombres my_package.my_module, el cual no existe.

    Para solucionar esto, necesitamos parchear el atributo sleep del módulo time directamente. Podemos hacer esto cambiando el decorador a @patch ("time.sleep"). Esto parcheará el atributo sleep del módulo time incorporado y simulará su comportamiento en nuestra prueba unitaria.

    Aquí está el código actualizado:

    import unittest
    from unittest.mock import patch
    
    from my_package import my_module
    
    @patch("time.sleep")
    class TestMyPackage(unittest.TestCase):
        def test_bla(self, timepatch):
            my_module.my_function()
    

    Con este código actualizado, la función time.sleep se parcheará correctamente en la llamada a la función my_module.my_function dentro del método de prueba test_bla.

Comments are closed.