如何使pytest灯具与装饰功能一起使用?

时间:2013-10-27 04:34:35

标签: python unit-testing decorator pytest

当我装饰以夹具作为参数的测试函数时,

py.test似乎失败了。

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

在这个简单的例子中,我收到以下错误:

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

有没有办法解决这个问题,最好不要过多地修改装饰器? (因为装饰器也在测试代码之外使用。)

2 个答案:

答案 0 :(得分:28)

貌似functools.wraps不能很好地完成这项任务,所以它打破了py.test的内省。

使用decorator包创建装饰器似乎可以解决问题。

import decorator

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

答案 1 :(得分:4)

Fixture功能取决于测试功能签名。

如果您可以按照以下方式更改包装器签名,它将起作用。

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

如果你不能改变它,那就做另一个装饰者:

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

使用test_somthing装饰deco_x

@deco_x
@deco
def test_something(x):
    assert x == 0
相关问题