更新到 Django 1.8-AttributeError: Django.test. TestCase 没有属性‘ cls_atomics’

我将 Django 1.7项目更新为 Django 1.8,现在在运行测试(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'

如果通过测试进行调试,我可以一步一步地完成所有行,没有任何问题,但是在最后一行之后会抛出异常。

这是一个示例测试:

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

我该怎么补救?

13676 次浏览

我相信原因是您的 setUpClass(cls)类方法没有调用 super。因此,django.tests.TestCase.setUpClass不被调用

cls.cls_atomics = cls._enter_atomics()

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

您应该将 super(ATestTests, cls).setUpClass()添加到您的 setUpClass

下面是调用基类的完整代码(按照 @ J. C. Leitão的建议) :

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)

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

@classmethod
def tearDownClass(cls):
pass

我也不叫 django.setup

对于 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')

文档是 给你