Cómo decorar dinámicamente una clase de pruebas de Python con múltiples parches
Se define una función en source.py y se llama en use_source.py. Lo aplico desde test.py de la siguiente manera:
source.py
def ejemplo_funcion():
print("No quiero que esto se ejecute")
use_source.py
from source import ejemplo_funcion
def llamar_ejemplo_funcion():
ejemplo_funcion()
test.py
import unittest
from unittest.mock import patch
import use_source
file_names = ["use_source.ejemplo_funcion"]
def funcion_falsa():
print("Quiero que esto se ejecute en su lugar")
@patch(file_names[0], new=funcion_falsa)
class TestEjemplo(unittest.TestCase):
def test_ejemplo(self):
use_source.llamar_ejemplo_funcion()
if __name__ == '__main__':
unittest.main()
Sin embargo, tengo varios archivos como use_source.py que deseo modificar, así que aquí está mi pregunta:
¿Cómo puedo llamar dinámicamente al decorador patch dado una lista de objetivos?
Estoy buscando algo como esto:
@patch_list(file_names, new=funcion_falsa)
class TestEjemplo(unittest.TestCase):
Podría hacer esto, pero tengo un número alto y variable de archivos para modificar:
@patch(file_names[0], new=funcion_falsa)
@patch(file_names[1], new=funcion_falsa)
class TestEjemplo(unittest.TestCase):
Por último, busco una solución que solo modifique test.py.
davy.ai
Una posible solución es utilizar un bucle para aplicar dinámicamente el decorador
patch
a cada destino en la lista. Aquí tienes un ejemplo de implementación:En esta implementación, definimos una nueva función decoradora llamada
patch_list
que toma un número variable de argumentos (*targets
) que representan la lista de destinos a ser parcheados. Luego, definimos un segundo nivel de decorador que aplicapatch
a cada destino en la lista utilizando*targets
y**kwargs
(que incluye la nueva funciónfake_function
). Finalmente, aplicamos el decoradorpatch_list
a la claseExampleTest
pasando la lista de nombres de archivos como argumentos (@patch_list(*file_names, new=fake_function)
).Esta implementación permite parchear un número dinámico de destinos y solo requiere modificación en el archivo
test.py
.