diff --git a/_pytest/fixtures.py b/_pytest/fixtures.py index f57031e1ad0..3a341ced013 100644 --- a/_pytest/fixtures.py +++ b/_pytest/fixtures.py @@ -18,6 +18,8 @@ ) from _pytest.outcomes import fail, TEST_OUTCOME from _pytest.compat import FuncargnamesCompatAttr +import types +import functools if sys.version_info[:2] == (2, 6): from ordereddict import OrderedDict @@ -824,6 +826,17 @@ def pytest_fixture_setup(fixturedef, request): return result +def copy_func(f): + """Based on http://stackoverflow.com/a/6528148/190597 (Glenn Maynard)""" + g = types.FunctionType(f.__code__, f.__globals__, name=f.__name__, + argdefs=f.__defaults__, + closure=f.__closure__) + g = functools.update_wrapper(g, f) + g.__kwdefaults__ = f.__kwdefaults__ + return g + + + class FixtureFunctionMarker: def __init__(self, scope, params, autouse=False, ids=None, name=None): self.scope = scope @@ -835,8 +848,10 @@ def __init__(self, scope, params, autouse=False, ids=None, name=None): def __call__(self, function): if isclass(function): raise ValueError( - "class fixtures not supported (may be in the future)") - function._pytestfixturefunction = self + "class fixtures not supported (may be in the future)") + if getattr(function, "_pytestfixturefunction", False): + function = copy_func(function) + return function