Merge pull request #1206 from The-Compiler/collect-getattr
Don't collect classes with truthy __getattr__.
This commit is contained in:
commit
b5d65e5139
|
@ -406,7 +406,10 @@ class PyCollector(PyobjMixin, pytest.Collector):
|
||||||
""" Look for the __test__ attribute, which is applied by the
|
""" Look for the __test__ attribute, which is applied by the
|
||||||
@nose.tools.istest decorator
|
@nose.tools.istest decorator
|
||||||
"""
|
"""
|
||||||
return safe_getattr(obj, '__test__', False)
|
# We explicitly check for "is True" here to not mistakenly treat
|
||||||
|
# classes with a custom __getattr__ returning something truthy (like a
|
||||||
|
# function) as test classes.
|
||||||
|
return safe_getattr(obj, '__test__', False) is True
|
||||||
|
|
||||||
def classnamefilter(self, name):
|
def classnamefilter(self, name):
|
||||||
return self._matches_prefix_or_glob_option('python_classes', name)
|
return self._matches_prefix_or_glob_option('python_classes', name)
|
||||||
|
|
|
@ -283,6 +283,35 @@ class TestNoselikeTestAttribute:
|
||||||
assert len(call.items) == 1
|
assert len(call.items) == 1
|
||||||
assert call.items[0].cls.__name__ == "TC"
|
assert call.items[0].cls.__name__ == "TC"
|
||||||
|
|
||||||
|
def test_class_with_nasty_getattr(self, testdir):
|
||||||
|
"""Make sure we handle classes with a custom nasty __getattr__ right.
|
||||||
|
|
||||||
|
With a custom __getattr__ which e.g. returns a function (like with a
|
||||||
|
RPC wrapper), we shouldn't assume this meant "__test__ = True".
|
||||||
|
"""
|
||||||
|
# https://github.com/pytest-dev/pytest/issues/1204
|
||||||
|
testdir.makepyfile("""
|
||||||
|
class MetaModel(type):
|
||||||
|
|
||||||
|
def __getattr__(cls, key):
|
||||||
|
return lambda: None
|
||||||
|
|
||||||
|
|
||||||
|
BaseModel = MetaModel('Model', (), {})
|
||||||
|
|
||||||
|
|
||||||
|
class Model(BaseModel):
|
||||||
|
|
||||||
|
__metaclass__ = MetaModel
|
||||||
|
|
||||||
|
def test_blah(self):
|
||||||
|
pass
|
||||||
|
""")
|
||||||
|
reprec = testdir.inline_run()
|
||||||
|
assert not reprec.getfailedcollections()
|
||||||
|
call = reprec.getcalls("pytest_collection_modifyitems")[0]
|
||||||
|
assert not call.items
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.issue351
|
@pytest.mark.issue351
|
||||||
class TestParameterize:
|
class TestParameterize:
|
||||||
|
|
Loading…
Reference in New Issue