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
.