Skip to content

Commit e4d4451

Browse files
author
Martijn van Oosterhout
committed
Fix classmethod test.
This test was incorrect in the case where the method was inherited from a subclass. Which ironically is precisely what the function was supposed to test. Fixes #597
1 parent 8bd3d3e commit e4d4451

File tree

2 files changed

+74
-1
lines changed

2 files changed

+74
-1
lines changed

pytest_django/plugin.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,9 @@ def _classmethod_is_defined_at_leaf(cls, method_name):
277277
f = method.__func__
278278
except AttributeError:
279279
pytest.fail('%s.%s should be a classmethod' % (cls, method_name))
280-
if PY2 and not (inspect.ismethod(method) and method.__self__ is cls):
280+
if PY2 and not (inspect.ismethod(method) and
281+
inspect.isclass(method.__self__) and
282+
issubclass(cls, method.__self__)):
281283
pytest.fail('%s.%s should be a classmethod' % (cls, method_name))
282284
return f is not super_method.__func__
283285

tests/test_unittest.py

+71
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,77 @@ def test_pass(self):
141141
])
142142
assert result.ret == 1
143143

144+
def test_setUpClass_multiple_subclasses(self, django_testdir):
145+
django_testdir.create_test_module('''
146+
from django.test import TestCase
147+
148+
149+
class TestFoo(TestCase):
150+
@classmethod
151+
def setUpClass(cls):
152+
super(TestFoo, cls).setUpClass()
153+
154+
def test_shared_TestFoo(self):
155+
pass
156+
157+
158+
class TestBar(TestFoo):
159+
def test_bar1(self):
160+
pass
161+
162+
163+
class TestBar2(TestFoo):
164+
def test_bar21(self):
165+
pass
166+
''')
167+
168+
result = django_testdir.runpytest_subprocess('-v', '-s')
169+
result.stdout.fnmatch_lines([
170+
"TestFoo::test_shared PASSED",
171+
"TestBar::test_bar1 PASSED",
172+
"TestBar::test_shared PASSED",
173+
"TestBar2::test_bar21 PASSED",
174+
"TestBar2::test_shared PASSED",
175+
])
176+
assert result.ret == 1
177+
178+
def test_setUpClass_skip(self, django_testdir):
179+
django_testdir.create_test_module('''
180+
from django.test import TestCase
181+
import pytest
182+
183+
184+
class TestFoo(TestCase):
185+
@classmethod
186+
def setUpClass(cls):
187+
if cls is TestFoo:
188+
raise pytest.skip("Skip base class")
189+
super(TestFoo, cls).setUpClass()
190+
191+
def test_shared(self):
192+
pass
193+
194+
195+
class TestBar(TestFoo):
196+
def test_bar1(self):
197+
pass
198+
199+
200+
class TestBar2(TestFoo):
201+
def test_bar21(self):
202+
pass
203+
''')
204+
205+
result = django_testdir.runpytest_subprocess('-v', '-s')
206+
result.stdout.fnmatch_lines([
207+
"TestFoo::test_shared SKIPPED",
208+
"TestBar::test_bar1 PASSED",
209+
"TestBar::test_shared PASSED",
210+
"TestBar2::test_bar21 PASSED",
211+
"TestBar2::test_shared PASSED",
212+
])
213+
assert result.ret == 1
214+
144215
def test_multi_inheritance_setUpClass(self, django_testdir):
145216
django_testdir.create_test_module('''
146217
from django.test import TestCase

0 commit comments

Comments
 (0)