python - Nariz ignora la prueba con decorador personalizado.
decorator ignore (1)
Si recuerdo correctamente, la carga de la prueba se basa en sus nombres (funciones cuyo nombre comienza con prueba_). En el fragmento que publicó, no copia el atributo __name__
de la función en su función de contenedor, por lo que el nombre de la función devuelta es wrapTest
y nose decide que no es una prueba.
Una forma fácil de copiar los atributos de la función a la nueva es utilizar functools.wraps
.
Tengo algunas pruebas de integración relativamente complejas en mi código Python. Los simplifiqué enormemente con un decorador personalizado y estoy muy contento con el resultado. Aquí hay un ejemplo simple de cómo se ve mi decorador:
def specialTest(fn):
def wrapTest(self):
#do some some important stuff
pass
return wrapTest
Esto es lo que puede parecer una prueba:
class Test_special_stuff(unittest.TestCase):
@specialTest
def test_something_special(self):
pass
Esto funciona muy bien y es ejecutado por el corredor de pruebas de PyCharm sin ningún problema. Sin embargo, cuando ejecuto una prueba desde la línea de comandos utilizando Nose, se omite cualquier prueba con el decorador @specialTest. He intentado nombrar al decorador como testSpecial, por lo que coincide con las reglas predeterminadas, pero luego mi parámetro FN no se pasa.
¿Cómo puedo hacer que Nose ejecute esos métodos de prueba y trate al decorador como se pretende?
SOLUCIÓN
Gracias a madjar, conseguí este trabajo al reestructurar mi código para que se pareciera a esto, usando functools.wraps y cambiando el nombre de la envoltura:
from functools import wraps
def specialTest(fn):
@wraps(fn)
def test_wrapper(self,*args,**kwargs):
#do some some important stuff
pass
return test_wrapper
class Test_special_stuff(unittest.TestCase):
@specialTest
def test_something_special(self):
pass