Skip to content

Commit

Permalink
Fix fixtures named teardown being considered by nose (#10696)
Browse files Browse the repository at this point in the history
Closes #10597
  • Loading branch information
Tbruno25 committed Jan 27, 2023
1 parent 86a1beb commit 5dbfb8e
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 3 deletions.
1 change: 1 addition & 0 deletions AUTHORS
Expand Up @@ -348,6 +348,7 @@ Thomas Grainger
Thomas Hisch
Tim Hoffmann
Tim Strazny
TJ Bruno
Tobias Diez
Tom Dalton
Tom Viner
Expand Down
1 change: 1 addition & 0 deletions changelog/10597.bugfix.rst
@@ -0,0 +1 @@
Fix bug where a fixture method named ``teardown`` would be called as part of ``nose`` teardown stage.
6 changes: 3 additions & 3 deletions src/_pytest/python.py
Expand Up @@ -847,7 +847,7 @@ def _inject_setup_class_fixture(self) -> None:
other fixtures (#517).
"""
setup_class = _get_first_non_fixture_func(self.obj, ("setup_class",))
teardown_class = getattr(self.obj, "teardown_class", None)
teardown_class = _get_first_non_fixture_func(self.obj, ("teardown_class",))
if setup_class is None and teardown_class is None:
return

Expand Down Expand Up @@ -884,12 +884,12 @@ def _inject_setup_method_fixture(self) -> None:
emit_nose_setup_warning = True
setup_method = _get_first_non_fixture_func(self.obj, (setup_name,))
teardown_name = "teardown_method"
teardown_method = getattr(self.obj, teardown_name, None)
teardown_method = _get_first_non_fixture_func(self.obj, (teardown_name,))
emit_nose_teardown_warning = False
if teardown_method is None and has_nose:
teardown_name = "teardown"
emit_nose_teardown_warning = True
teardown_method = getattr(self.obj, teardown_name, None)
teardown_method = _get_first_non_fixture_func(self.obj, (teardown_name,))
if setup_method is None and teardown_method is None:
return

Expand Down
21 changes: 21 additions & 0 deletions testing/test_nose.py
Expand Up @@ -496,3 +496,24 @@ def test_it():
)
result = pytester.runpytest(p, "-p", "nose")
assert result.ret == 0


@pytest.mark.parametrize("fixture_name", ("teardown", "teardown_class"))
def test_teardown_fixture_not_called_directly(fixture_name, pytester: Pytester) -> None:
"""Regression test for #10597."""
p = pytester.makepyfile(
f"""
import pytest
class TestHello:
@pytest.fixture
def {fixture_name}(self):
yield
def test_hello(self, {fixture_name}):
assert True
"""
)
result = pytester.runpytest(p, "-p", "nose")
assert result.ret == 0

0 comments on commit 5dbfb8e

Please sign in to comment.