42
42
CONFIGURATION_ENV = 'DJANGO_CONFIGURATION'
43
43
INVALID_TEMPLATE_VARS_ENV = 'FAIL_INVALID_TEMPLATE_VARS'
44
44
45
+ PY2 = sys .version_info [0 ] == 2
46
+
45
47
46
48
# ############### pytest hooks ################
47
49
@@ -259,7 +261,7 @@ def pytest_configure():
259
261
_setup_django ()
260
262
261
263
262
- def _method_is_defined_at_leaf (cls , method_name ):
264
+ def _classmethod_is_defined_at_leaf (cls , method_name ):
263
265
super_method = None
264
266
265
267
for base_cls in cls .__bases__ :
@@ -269,7 +271,15 @@ def _method_is_defined_at_leaf(cls, method_name):
269
271
assert super_method is not None , (
270
272
'%s could not be found in base class' % method_name )
271
273
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__
273
283
274
284
275
285
_disabled_classmethods = {}
@@ -281,9 +291,9 @@ def _disable_class_methods(cls):
281
291
282
292
_disabled_classmethods [cls ] = (
283
293
cls .setUpClass ,
284
- _method_is_defined_at_leaf (cls , 'setUpClass' ),
294
+ _classmethod_is_defined_at_leaf (cls , 'setUpClass' ),
285
295
cls .tearDownClass ,
286
- _method_is_defined_at_leaf (cls , 'tearDownClass' ),
296
+ _classmethod_is_defined_at_leaf (cls , 'tearDownClass' ),
287
297
)
288
298
289
299
cls .setUpClass = types .MethodType (lambda cls : None , cls )
0 commit comments