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.)

24
demandé sur falsetru 2013-10-27 08:34:35

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)
25
répondu jck 2013-10-27 05:53:13

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
4
répondu falsetru 2013-10-27 05:12:36