更新到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)