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
@@ -263,7 +265,7 @@ def pytest_configure():
263
265
_setup_django ()
264
266
265
267
266
- def _method_is_defined_at_leaf (cls , method_name ):
268
+ def _classmethod_is_defined_at_leaf (cls , method_name ):
267
269
super_method = None
268
270
269
271
for base_cls in cls .__bases__ :
@@ -273,7 +275,15 @@ def _method_is_defined_at_leaf(cls, method_name):
273
275
assert super_method is not None , (
274
276
'%s could not be found in base class' % method_name )
275
277
276
- return getattr (cls , method_name ).__func__ is not super_method .__func__
278
+ method = getattr (cls , method_name )
279
+
280
+ try :
281
+ f = method .__func__
282
+ except AttributeError :
283
+ pytest .fail ('%s.%s should be a classmethod' % (cls , method_name ))
284
+ if PY2 and not (inspect .ismethod (method ) and method .__self__ is cls ):
285
+ pytest .fail ('%s.%s should be a classmethod' % (cls , method_name ))
286
+ return f is not super_method .__func__
277
287
278
288
279
289
_disabled_classmethods = {}
@@ -285,9 +295,9 @@ def _disable_class_methods(cls):
285
295
286
296
_disabled_classmethods [cls ] = (
287
297
cls .setUpClass ,
288
- _method_is_defined_at_leaf (cls , 'setUpClass' ),
298
+ _classmethod_is_defined_at_leaf (cls , 'setUpClass' ),
289
299
cls .tearDownClass ,
290
- _method_is_defined_at_leaf (cls , 'tearDownClass' ),
300
+ _classmethod_is_defined_at_leaf (cls , 'tearDownClass' ),
291
301
)
292
302
293
303
cls .setUpClass = types .MethodType (lambda cls : None , cls )
0 commit comments