web-dev-qa-db-ja.com

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

どうすれば修正できますか?

57
habakuk

setUpClass(cls)クラスメソッドがsuperを呼び出していないことが理由だと思います。そのため、_Django.tests.TestCase.setUpClass_は呼び出されず、

_cls.cls_atomics = cls._enter_atomics()
_

が呼び出されず、当然_cls_atomics_が未定義になります。

setUpClasssuper(ATestTests, cls).setUpClass()を追加する必要があります。

96
Jorge Leitão

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 です。

27
seddonym

TestCasesetUpClassを使用しているがtearDownClassメソッドを持たないという同様の問題がありました。空のテストを追加すると、テストに合格します。

@classmethod
def tearDownClass(cls):
    pass

また、Django.setupを呼び出しません。

6
Matt