Comment puis-je faire fonctionner les luminaires pytest avec des fonctions décorées?
Py.le test semble échouer quand je décore des fonctions de test qui ont un luminaire comme argument.
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
Dans cet exemple simple, j'obtiens l'erreur suivante:
TypeError: test_something() takes exactly 1 argument (0 given).
Existe-t-il un moyen de résoudre ce problème, de préférence sans trop modifier le décorateur? (Puisque le Décorateur est également utilisé en dehors du code de test.)
2 réponses
Cela ressemble à des functools.wraps ne fait pas le travail assez bien, donc il casse py.test d'introspection.
Créer le décorateur en utilisant le paquet décorateur semble faire l'affaire.
import decorator
def deco(func):
def wrapper(func, *args, **kwargs):
return func(*args, **kwargs)
return decorator.decorator(wrapper, func)
La fonction de montage dépend de la signature de la fonction de test.
Si vous pouvez modifier la signature du wrapper comme suit, cela fonctionnera.
def deco(func):
@functools.wraps(func)
def wrapper(x):
return func(x)
return wrapper
Si vous ne pouvez pas le changer, faites un autre décorateur:
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
Et décorer test_somthing
avec deco_x
:
@deco_x
@deco
def test_something(x):
assert x == 0