关于python 3.x:更新到Django 1.8 – AttributeError:django.test.TestCase没有属性’cls_atomics’

Update to Django 1.8 - AttributeError: django.test.TestCase has no attribute 'cls_atomics'

我将django 1.7项目更新为django1.8,现在在运行测试时出错(这是django.test.TestCase的子类)。

1
2
3
4
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'

如果我通过测试进行调试,那么我可以毫无问题地单步执行所有行,但是在最后一行之后会抛出异常。

这是一个示例测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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)

我的环境:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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)类方法没有调用super。因此,没有调用django.tests.TestCase.setUpClass,并且

1
cls.cls_atomics = cls._enter_atomics()

不调用,自然导致cls_atomics未定义。

你应该把super(ATestTests, cls).setUpClass()加到你的setUpClass上。


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

1
2
3
4
5
6
7
8
9
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方法。当我添加一个空的测试时,我的测试通过了:

1
2
3
@classmethod
def tearDownClass(cls):
    pass

我也不叫django.setup


下面是调用基类的完整代码(如@j.c.leit建议的那样)?o):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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)