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)