allow staticmethods to be detected as test functions
Allow a class method decorated `@staticmethod` to be collected as a test function (if it meets the usual criteria). This feature will not work in Python 2.6 -- static methods will still be ignored there.
This commit is contained in:
parent
9b51fc646c
commit
9b9fede5be
1
AUTHORS
1
AUTHORS
|
@ -118,6 +118,7 @@ Michael Droettboom
|
||||||
Michael Seifert
|
Michael Seifert
|
||||||
Michal Wajszczuk
|
Michal Wajszczuk
|
||||||
Mike Lundy
|
Mike Lundy
|
||||||
|
Nathaniel Waisbrot
|
||||||
Ned Batchelder
|
Ned Batchelder
|
||||||
Neven Mundar
|
Neven Mundar
|
||||||
Nicolas Delaby
|
Nicolas Delaby
|
||||||
|
|
|
@ -271,10 +271,19 @@ class PyCollector(PyobjMixin, main.Collector):
|
||||||
return self._matches_prefix_or_glob_option('python_classes', name)
|
return self._matches_prefix_or_glob_option('python_classes', name)
|
||||||
|
|
||||||
def istestfunction(self, obj, name):
|
def istestfunction(self, obj, name):
|
||||||
return (
|
if self.funcnamefilter(name) or self.isnosetest(obj):
|
||||||
(self.funcnamefilter(name) or self.isnosetest(obj)) and
|
if isinstance(obj, staticmethod):
|
||||||
safe_getattr(obj, "__call__", False) and fixtures.getfixturemarker(obj) is None
|
# static methods need to be unwrapped
|
||||||
)
|
obj = safe_getattr(obj, '__func__', False)
|
||||||
|
if obj is False:
|
||||||
|
# Python 2.6 wraps in a different way that we won't try to handle
|
||||||
|
self.warn(code="C2", message="cannot collect static method %r because it is not a function (always the case in Python 2.6)" % name)
|
||||||
|
return False
|
||||||
|
return (
|
||||||
|
safe_getattr(obj, "__call__", False) and fixtures.getfixturemarker(obj) is None
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
def istestclass(self, obj, name):
|
def istestclass(self, obj, name):
|
||||||
return self.classnamefilter(name) or self.isnosetest(obj)
|
return self.classnamefilter(name) or self.isnosetest(obj)
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Allow class methods decorated as ``@staticmethod`` to be candidates for collection as a test function. (Only for Python 2.7 and above. Python 2.6 will still ignore static methods.)
|
|
@ -143,6 +143,26 @@ class TestClass(object):
|
||||||
"*collected 0*",
|
"*collected 0*",
|
||||||
])
|
])
|
||||||
|
|
||||||
|
def test_static_method(self, testdir):
|
||||||
|
testdir.getmodulecol("""
|
||||||
|
class Test(object):
|
||||||
|
@staticmethod
|
||||||
|
def test_something():
|
||||||
|
pass
|
||||||
|
""")
|
||||||
|
result = testdir.runpytest()
|
||||||
|
if sys.version_info < (2,7):
|
||||||
|
# in 2.6, the code to handle static methods doesn't work
|
||||||
|
result.stdout.fnmatch_lines([
|
||||||
|
"*collected 0 items*",
|
||||||
|
"*cannot collect static method*",
|
||||||
|
])
|
||||||
|
else:
|
||||||
|
result.stdout.fnmatch_lines([
|
||||||
|
"*collected 1 item*",
|
||||||
|
"*1 passed in*",
|
||||||
|
])
|
||||||
|
|
||||||
def test_setup_teardown_class_as_classmethod(self, testdir):
|
def test_setup_teardown_class_as_classmethod(self, testdir):
|
||||||
testdir.makepyfile(test_mod1="""
|
testdir.makepyfile(test_mod1="""
|
||||||
class TestClassMethod(object):
|
class TestClassMethod(object):
|
||||||
|
|
Loading…
Reference in New Issue