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).
有没有办法解决这个问题,最好不要过多地修改装饰器? (因为装饰器也在测试代码之外使用。)
答案 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