Merge pull request #3500 from RonnyPfannschmidt/fix-3498-unittest-marks

fix #3498 - correctly consider marks on unittest classes
This commit is contained in:
Bruno Oliveira 2018-05-24 13:51:17 -03:00 committed by GitHub
commit 48215fdcb9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 66 additions and 3 deletions

View File

@ -984,7 +984,7 @@ class FixtureManager(object):
session.config.pluginmanager.register(self, "funcmanage")
def getfixtureinfo(self, node, func, cls, funcargs=True):
if funcargs and not hasattr(node, "nofuncargs"):
if funcargs and not getattr(node, "nofuncargs", False):
argnames = getfuncargnames(func, cls=cls)
else:
argnames = ()

View File

@ -1155,7 +1155,7 @@ class Function(FunctionMixin, nodes.Item, fixtures.FuncargnamesCompatAttr):
if fixtureinfo is None:
fixtureinfo = self.session._fixturemanager.getfixtureinfo(
self.parent, self.obj, self.cls,
self, self.obj, self.cls,
funcargs=not self._isyieldedfunction())
self._fixtureinfo = fixtureinfo
self.fixturenames = fixtureinfo.names_closure

View File

@ -54,7 +54,7 @@ class UnitTestCase(Class):
continue
funcobj = getattr(x, 'im_func', x)
transfer_markers(funcobj, cls, module)
yield TestCaseFunction(name, parent=self)
yield TestCaseFunction(name, parent=self, callobj=funcobj)
foundsomething = True
if not foundsomething:
@ -66,6 +66,7 @@ class UnitTestCase(Class):
class TestCaseFunction(Function):
nofuncargs = True
_excinfo = None
def setup(self):

1
changelog/3498.bugfix Normal file
View File

@ -0,0 +1 @@
Fix ``usefixtures`` mark applyed to unittest tests by correctly instantiating ``FixtureInfo``.

View File

@ -828,3 +828,64 @@ def test_class_method_containing_test_issue1558(testdir):
""")
reprec = testdir.inline_run()
reprec.assertoutcome(passed=1)
@pytest.mark.issue(3498)
@pytest.mark.parametrize("base", [
'six.moves.builtins.object',
'unittest.TestCase',
'unittest2.TestCase',
])
def test_usefixtures_marker_on_unittest(base, testdir):
module = base.rsplit('.', 1)[0]
pytest.importorskip(module)
testdir.makepyfile(conftest="""
import pytest
@pytest.fixture(scope='function')
def fixture1(request, monkeypatch):
monkeypatch.setattr(request.instance, 'fixture1', True )
@pytest.fixture(scope='function')
def fixture2(request, monkeypatch):
monkeypatch.setattr(request.instance, 'fixture2', True )
def node_and_marks(item):
print(item.nodeid)
for mark in item.iter_markers():
print(" ", mark)
@pytest.fixture(autouse=True)
def my_marks(request):
node_and_marks(request.node)
def pytest_collection_modifyitems(items):
for item in items:
node_and_marks(item)
""")
testdir.makepyfile("""
import pytest
import {module}
class Tests({base}):
fixture1 = False
fixture2 = False
@pytest.mark.usefixtures("fixture1")
def test_one(self):
assert self.fixture1
assert not self.fixture2
@pytest.mark.usefixtures("fixture1", "fixture2")
def test_two(self):
assert self.fixture1
assert self.fixture2
""".format(module=module, base=base))
result = testdir.runpytest('-s')
result.assert_outcomes(passed=2)