我将 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
我该如何解决这个问题?
我相信原因是你的
setUpClass(cls)
类方法没有调用 super。因此, 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
方法。 当我添加一个空的测试时,我的测试就通过了:
@classmethod
def tearDownClass(cls):
pass
我也不打电话
django.setup
。
这是调用基类的完整代码(如 @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)
对于那些正在寻找当前 Django 解决方案(版本 == 5.1)的人
SimpleTestCase 及其子类(例如 TestCase,...)依赖 setUpClass() 和 TeaDownClass() 来执行一些类范围的初始化(例如覆盖设置)。如果您需要重写这些方法,请不要忘记调用超级实现:
答案:记得在重写函数中的 def 之后立即调用 super.setUpClass()
@classmethod
def setUpClass(self) -> None:
super().setUpClass()
TestHelpers.setUpClass()
其他选项 选择的答案是使用 setUpTestData 而不是 setUpClass 特别是如果只是为 TestCase 设置初始测试数据
@classmethod
def setUpTestData(cls):
# Set up data for the whole TestCase
cls.foo = Foo.objects.create(bar="Test")
...
这也没关系,但是
请注意,如果测试在不支持事务的数据库上运行(例如,具有 MyISAM 引擎的 MySQL),则将在每次测试之前调用 setUpTestData(),从而抵消速度优势。