summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--_pytest/compat.py10
-rw-r--r--_pytest/fixtures.py6
-rw-r--r--changelog/2699.bugfix1
-rw-r--r--testing/python/collect.py14
-rw-r--r--testing/python/fixture.py6
5 files changed, 29 insertions, 8 deletions
diff --git a/_pytest/compat.py b/_pytest/compat.py
index 54271ce4f..255f69ce0 100644
--- a/_pytest/compat.py
+++ b/_pytest/compat.py
@@ -83,7 +83,15 @@ def num_mock_patch_args(function):
return len(patchings)
-def getfuncargnames(function, startindex=None):
+def getfuncargnames(function, startindex=None, cls=None):
+ """
+ @RonnyPfannschmidt: This function should be refactored when we revisit fixtures. The
+ fixture mechanism should ask the node for the fixture names, and not try to obtain
+ directly from the function object well after collection has occurred.
+ """
+ if startindex is None and cls is not None:
+ is_staticmethod = isinstance(cls.__dict__.get(function.__name__, None), staticmethod)
+ startindex = 0 if is_staticmethod else 1
# XXX merge with main.py's varnames
# assert not isclass(function)
realfunction = function
diff --git a/_pytest/fixtures.py b/_pytest/fixtures.py
index 4386500f4..f57031e1a 100644
--- a/_pytest/fixtures.py
+++ b/_pytest/fixtures.py
@@ -957,11 +957,7 @@ class FixtureManager:
def getfixtureinfo(self, node, func, cls, funcargs=True):
if funcargs and not hasattr(node, "nofuncargs"):
- if cls is not None:
- startindex = 1
- else:
- startindex = None
- argnames = getfuncargnames(func, startindex)
+ argnames = getfuncargnames(func, cls=cls)
else:
argnames = ()
usefixtures = getattr(func, "usefixtures", None)
diff --git a/changelog/2699.bugfix b/changelog/2699.bugfix
new file mode 100644
index 000000000..c5e07329b
--- /dev/null
+++ b/changelog/2699.bugfix
@@ -0,0 +1 @@
+Allow tests declared as ``@staticmethod`` to use fixtures.
diff --git a/testing/python/collect.py b/testing/python/collect.py
index bd7013b44..b24c0b2fd 100644
--- a/testing/python/collect.py
+++ b/testing/python/collect.py
@@ -147,11 +147,21 @@ class TestClass(object):
])
def test_static_method(self, testdir):
+ """Support for collecting staticmethod tests (#2528, #2699)"""
testdir.getmodulecol("""
+ import pytest
class Test(object):
@staticmethod
def test_something():
pass
+
+ @pytest.fixture
+ def fix(self):
+ return 1
+
+ @staticmethod
+ def test_fix(fix):
+ assert fix == 1
""")
result = testdir.runpytest()
if sys.version_info < (2, 7):
@@ -162,8 +172,8 @@ class TestClass(object):
])
else:
result.stdout.fnmatch_lines([
- "*collected 1 item*",
- "*1 passed in*",
+ "*collected 2 items*",
+ "*2 passed in*",
])
def test_setup_teardown_class_as_classmethod(self, testdir):
diff --git a/testing/python/fixture.py b/testing/python/fixture.py
index f8aef802f..06b08d68e 100644
--- a/testing/python/fixture.py
+++ b/testing/python/fixture.py
@@ -29,10 +29,16 @@ def test_getfuncargnames():
def f(self, arg1, arg2="hello"):
pass
+ @staticmethod
+ def static(arg1, arg2):
+ pass
+
assert fixtures.getfuncargnames(A().f) == ('arg1',)
if sys.version_info < (3, 0):
assert fixtures.getfuncargnames(A.f) == ('arg1',)
+ assert fixtures.getfuncargnames(A.static, cls=A) == ('arg1', 'arg2')
+
class TestFillFixtures(object):
def test_fillfuncargs_exposed(self):