更新到Django 1.8 – AttributeError:django.test.TestCase没有属性'cls_atomics'

我更新了Django 1.7项目到Django 1.8,现在运行testing(是django.test.TestCase子类)时会出错。

 Traceback (most recent call last): File "env\lib\site-packages\django\test\testcases.py", line 962, in tearDownClass cls._rollback_atomics(cls.cls_atomics) AttributeError: type object 'SomeTests' has no attribute 'cls_atomics' 

如果我通过testing进行debugging,则可以顺利执行所有行,但在最后一行之后会引发exception。

这是一个示例testing:

 import django import unittest from django.test import TestCase import logging import sys from builtins import classmethod, isinstance class ATestTests(TestCase): @classmethod def setUpClass(cls): django.setup() logging.basicConfig(stream=sys.stderr, level=logging.DEBUG) def setUp(self): self._app = Application(name="a") def testtest(self): self.assertIsNotNone(self._app) 

我的环境:

 astroid==1.3.4 colorama==0.3.3 defusedxml==0.4.1 Django==1.8 django-extensions==1.5.2 django-filter==0.9.2 djangorestframework==3.0.5 djangorestframework-xml==1.0.1 eight==0.3.0 future==0.11.4 logilab-common==0.63.2 Markdown==2.5.2 pylint==1.4.1 python-dateutil==2.4.1 python-mimeparse==0.1.4 six==1.9.0 xmltodict==0.9.2 

我怎样才能解决这个问题?

我相信原因是你的setUpClass(cls)类方法不是调用超级。 因此,不调用django.tests.TestCase.setUpClass

 cls.cls_atomics = cls._enter_atomics() 

没有被调用,自然导致cls_atomics未定义。

你应该将super(ATestTests, cls).setUpClass()到你的setUpClass

对于Django 1.8+,您应该使用TestCase.setUpTestData而不是TestCase.setUpClass

 class MyTests(TestCase): @classmethod def setUpTestData(cls): # Set up data for the whole TestCase cls.foo = Foo.objects.create(bar="Test") def test1(self): self.assertEqual(self.foo.bar, 'Test') 

文档在这里 。

我有一个类似的问题,其中一个TestCase使用setUpClass但没有tearDownClass方法。 当我添加一个空的testing时,我的testing通过:

 @classmethod def tearDownClass(cls): pass 

我也不叫django.setup

以下是调用基类的完整代码(如@JCLeitão所build议的):

 import django import unittest from django.test import TestCase import logging import sys from builtins import classmethod class ATestTests(TestCase): @classmethod def setUpClass(cls): super(ATestTests, cls).setUpClass() django.setup() logging.basicConfig(stream=sys.stderr, level=logging.DEBUG) def setUp(self): self._app = Application(name="a") def testtest(self): self.assertIsNotNone(self._app)