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
_が未定義になります。
setUpClass
にsuper(ATestTests, cls).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')
ドキュメントは here です。
TestCase
がsetUpClass
を使用しているがtearDownClass
メソッドを持たないという同様の問題がありました。空のテストを追加すると、テストに合格します。
@classmethod
def tearDownClass(cls):
pass
また、Django.setup
を呼び出しません。