diff --git a/changelog/2270.bugfix.rst b/changelog/2270.bugfix.rst index 45835deb639..0da08459745 100644 --- a/changelog/2270.bugfix.rst +++ b/changelog/2270.bugfix.rst @@ -1 +1,2 @@ -Fix ``self`` reference in function scoped fixtures that are in a plugin class +Fixed ``self`` reference in function-scoped fixtures defined plugin classes: previously ``self`` +would be a reference to a *test* class, not the *plugin* class. diff --git a/src/_pytest/fixtures.py b/src/_pytest/fixtures.py index 0640ebc900f..a8da1beecc6 100644 --- a/src/_pytest/fixtures.py +++ b/src/_pytest/fixtures.py @@ -897,6 +897,8 @@ def resolve_fixture_function(fixturedef, request): # request.instance so that code working with "fixturedef" behaves # as expected. if request.instance is not None: + # handle the case where fixture is defined not in a test class, but some other class + # (for example a plugin class with a fixture), see #2270 if hasattr(fixturefunc, "__self__") and not isinstance( request.instance, fixturefunc.__self__.__class__ ): diff --git a/testing/python/fixtures.py b/testing/python/fixtures.py index ee050b909e5..4f13dd245c5 100644 --- a/testing/python/fixtures.py +++ b/testing/python/fixtures.py @@ -3946,6 +3946,9 @@ def test_2(fix): reprec.assertoutcome(passed=2) def test_class_fixture_self_instance(self, testdir): + """Check that plugin classes which implement fixtures receive the plugin instance + as self (see #2270). + """ testdir.makeconftest( """ import pytest