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