django python-3.x django-1.8

Actualización a Django 1.8-AttributeError: django.test.TestCase no tiene el atributo ''cls_atomics''



python-3.x django-1.8 (4)

Aquí está el código completo con la llamada a la clase base (como lo sugiere @JC 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)

Actualicé un proyecto Django 1.7 a Django 1.8 y ahora obtengo errores cuando ejecuto las pruebas (que son subclases de 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''

Si depuro la prueba, puedo pasar por todas las líneas sin problemas, pero después de la última línea se produce la excepción.

Este es un ejemplo de prueba:

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)

Mi entorno:

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

¿Cómo puedo arreglar esto?


Creo que la razón es que su método de clase setUpClass(cls) no está llamando a super. Debido a eso, no se llama a django.tests.TestCase.setUpClass y

cls.cls_atomics = cls._enter_atomics()

no se llama, lo que hace que cls_atomics sea ​​indefinido.

Debe agregar super(ATestTests, cls).setUpClass() a su setUpClass .


Para Django 1.8+, debe usar TestCase.setUpTestData lugar de 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'')

La documentación está here .


Tuve un problema similar cuando TestCase usaba setUpClass pero no tenía un método tearDownClass . Mis pruebas pasan cuando agrego una vacía:

@classmethod def tearDownClass(cls): pass

Tampoco llamo a django.setup .