4242CONFIGURATION_ENV = 'DJANGO_CONFIGURATION'
4343INVALID_TEMPLATE_VARS_ENV = 'FAIL_INVALID_TEMPLATE_VARS'
4444
45+ PY2 = sys .version_info [0 ] == 2
46+
4547
4648# ############### pytest hooks ################
4749
@@ -259,7 +261,7 @@ def pytest_configure():
259261 _setup_django ()
260262
261263
262- def _method_is_defined_at_leaf (cls , method_name ):
264+ def _classmethod_is_defined_at_leaf (cls , method_name ):
263265 super_method = None
264266
265267 for base_cls in cls .__bases__ :
@@ -269,7 +271,15 @@ def _method_is_defined_at_leaf(cls, method_name):
269271 assert super_method is not None , (
270272 '%s could not be found in base class' % method_name )
271273
272- return getattr (cls , method_name ).__func__ is not super_method .__func__
274+ method = getattr (cls , method_name )
275+
276+ try :
277+ f = method .__func__
278+ except AttributeError :
279+ pytest .fail ('%s.%s should be a classmethod' % (cls , method_name ))
280+ if PY2 and not (inspect .ismethod (method ) and method .__self__ is cls ):
281+ pytest .fail ('%s.%s should be a classmethod' % (cls , method_name ))
282+ return f is not super_method .__func__
273283
274284
275285_disabled_classmethods = {}
@@ -281,9 +291,9 @@ def _disable_class_methods(cls):
281291
282292 _disabled_classmethods [cls ] = (
283293 cls .setUpClass ,
284- _method_is_defined_at_leaf (cls , 'setUpClass' ),
294+ _classmethod_is_defined_at_leaf (cls , 'setUpClass' ),
285295 cls .tearDownClass ,
286- _method_is_defined_at_leaf (cls , 'tearDownClass' ),
296+ _classmethod_is_defined_at_leaf (cls , 'tearDownClass' ),
287297 )
288298
289299 cls .setUpClass = types .MethodType (lambda cls : None , cls )
0 commit comments