tutorial test instalar python unit-testing decorator py.test

python - instalar - pytest test class



¿Cómo hago que los accesorios de pytest funcionen con funciones decoradas? (2)

La característica del accesorio depende de la firma de la función de prueba.

Si puede cambiar la firma del envoltorio como sigue, funcionará.

def deco(func): @functools.wraps(func) def wrapper(x): return func(x) return wrapper

Si no puedes cambiarlo, haz otro decorador:

def deco(func): @functools.wraps(func) def wrapper(*args, **kwargs): return func(*args, **kwargs) return wrapper def deco_x(func): @functools.wraps(func) def wrapper(x): return func(x) return wrapper

Y decorar test_somthing con deco_x :

@deco_x @deco def test_something(x): assert x == 0

py.test parece fallar cuando decoro funciones de prueba que tienen un accesorio como argumento.

def deco(func): @functools.wraps(func) def wrapper(*args, **kwargs): return func(*args, **kwargs) return wrapper @pytest.fixture def x(): return 0 @deco def test_something(x): assert x == 0

En este sencillo ejemplo, obtengo el siguiente error:

TypeError: test_something() takes exactly 1 argument (0 given).

¿Hay alguna manera de solucionar esto, preferiblemente sin modificar demasiado el decorador? (Dado que el decorador también se usa fuera del código de prueba).


Parece que functools.wraps no hace el trabajo lo suficientemente bien, así que rompe la introspección de py.test.

Crear el decorador usando el paquete decorator parece hacer el truco.

import decorator def deco(func): def wrapper(func, *args, **kwargs): return func(*args, **kwargs) return decorator.decorator(wrapper, func)