summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Bruhin <me@the-compiler.org>2021-02-23 17:56:42 +0100
committerFlorian Bruhin <me@the-compiler.org>2021-02-23 18:00:56 +0100
commit54a154c86f4806327081b80193cebca7934468d0 (patch)
tree2fbe41332debbca355f77cbc76ee42cc6f37af9d
parentd6522b517bceca2c8f7be1a34a3efd7d741a3132 (diff)
downloadpytest-54a154c86f4806327081b80193cebca7934468d0.tar.gz
Allow Class.from_parent to forward custom parameters to the constructor
Similarly to #7143, at work we have a project with a custom pytest.Class subclass, adding an additional argument to the constructor. All from_parent implementations in pytest accept and forward *kw, except Class (before this change) and DoctestItem - since I'm not familiar with doctest support, I've left the latter as-is.
-rw-r--r--changelog/8367.bugfix.rst1
-rw-r--r--src/_pytest/python.py4
-rw-r--r--testing/test_collection.py18
3 files changed, 21 insertions, 2 deletions
diff --git a/changelog/8367.bugfix.rst b/changelog/8367.bugfix.rst
new file mode 100644
index 000000000..f4b036701
--- /dev/null
+++ b/changelog/8367.bugfix.rst
@@ -0,0 +1 @@
+Fix ``Class.from_parent`` so it forwards extra keyword arguments to the constructor.
diff --git a/src/_pytest/python.py b/src/_pytest/python.py
index 726241cb5..944c395a8 100644
--- a/src/_pytest/python.py
+++ b/src/_pytest/python.py
@@ -763,9 +763,9 @@ class Class(PyCollector):
"""Collector for test methods."""
@classmethod
- def from_parent(cls, parent, *, name, obj=None):
+ def from_parent(cls, parent, *, name, obj=None, **kw):
"""The public constructor."""
- return super().from_parent(name=name, parent=parent)
+ return super().from_parent(name=name, parent=parent, **kw)
def collect(self) -> Iterable[Union[nodes.Item, nodes.Collector]]:
if not safe_getattr(self.obj, "__test__", True):
diff --git a/testing/test_collection.py b/testing/test_collection.py
index 3dd9283ec..39538ae98 100644
--- a/testing/test_collection.py
+++ b/testing/test_collection.py
@@ -1360,6 +1360,24 @@ def test_fscollector_from_parent(pytester: Pytester, request: FixtureRequest) ->
assert collector.x == 10
+def test_class_from_parent(pytester: Pytester, request: FixtureRequest) -> None:
+ """Ensure Class.from_parent can forward custom arguments to the constructor."""
+
+ class MyCollector(pytest.Class):
+ def __init__(self, name, parent, x):
+ super().__init__(name, parent)
+ self.x = x
+
+ @classmethod
+ def from_parent(cls, parent, *, name, x):
+ return super().from_parent(parent=parent, name=name, x=x)
+
+ collector = MyCollector.from_parent(
+ parent=request.session, name="foo", x=10
+ )
+ assert collector.x == 10
+
+
class TestImportModeImportlib:
def test_collect_duplicate_names(self, pytester: Pytester) -> None:
"""--import-mode=importlib can import modules with same names that are not in packages."""