[pyar] Django + Testing unitario
Aníbal Lovaglio
aniballovaglio en yahoo.com.ar
Lun Dic 3 22:42:10 ART 2012
Buenas a todos:
Tengo una consulta para hacerles, hace un tiempo que estoy tratando de hacer que funcione una cosa y no logre obtenerlo.
El problema es el siguiente.
Estoy tratando de testear unitariamente una clase la cual depende de otras
dos clases, para hacerlo mas facil voy a colocar la definicion de la
clase.
class Delivery(models.Model):
"""Delivery class.
It is the object or artifact that the Student presents as his work for a
given assignment. In this case it is considered required to be a zip
package.
"""
file = models.FileField(upload_to=BASE_PATH + FOLDERNAME)
student = models.ForeignKey(Student)
practice = models.ForeignKey(Practice)
deliverDate = models.DateField()
def __str__(self):
"""Stringify the Delivery"""
return (str(self.practice) + " - " + str(self.student) + " - " + str(self.deliverDate))
Esta clase representa una entrega, la cual pertenece a un estudiante y es esta hecha sobre una practica. (estas son las
otras dos clases de la cual depende.)
Cuando
quiero testear unitariamente esta clase por ejemplo su srt, para hacer
una prueba sencilla hago lo siguiente. Se que no sería algo importante
de testear pero necesito ver como funciona esto para poder probar otras
cosas mas complejas.
class DeliveryTest(TestCase):
def setUp(self):
self.student = MagicMock(spec=Student)
self.student.name = "Nombre y Apellido"
self.practice = MagicMock(spec=Practice)
self.practice.uid = "Tp inicial"
def testDeliveryToStringReturnNamePracticeNameStudentAndDeadLinePractice(self):
deliveryDate = "2012-11-25"
str_practice_return = "Tp inicial - Nombre y Apellido - 2012-11-25"
delivery = Delivery()
isinstance(self.student, Student)
isinstance(self.practice, Practice)
delivery.student = self.student
delivery.practice = self.practice
delivery.deliverDate = deliveryDate
self.assertEqual(str(delivery), str_practice_return)
Lo que estoy haciendo es tratando de crear un mock que reemplace a las
clases, lo hago para que sea realmente unitario el test y solo se pruebe la clase que quiero probar sin depender de constructores de otras
clases.
Cuando corro el test, me tira el siguiente error...
[localhost] local: python manage.py test model
Creating test database for alias 'default'...
E
======================================================================
ERROR: testDeliveryToStringReturnNamePracticeNameStudentAndDeadLinePractice (seal.test.unit.deliveryTest.DeliveryTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/martin/workspace/seal/web/seal/test/unit/deliveryTest.py", line 27, in testDeliveryToStringReturnNamePracticeNameStudentAndDeadLinePractice
delivery.student = self.student
File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/related.py", line 369, in __set__
instance._state.db = router.db_for_write(instance.__class__, instance=value)
File "/usr/local/lib/python2.7/dist-packages/django/db/utils.py", line 141, in _route_db
return hints['instance']._state.db or DEFAULT_DB_ALIAS
File "/usr/local/lib/python2.7/dist-packages/mock.py", line 658, in __getattr__
raise AttributeError("Mock object has no attribute %r" % name)
AttributeError: Mock object has no attribute '_state'
----------------------------------------------------------------------
Ran 1 test in 0.002s
FAILED (errors=1)
Destroying test database for alias 'default'...
Fatal error: local() encountered an error (return code 1) while executing 'python manage.py test model'
Aborting.
Los isinstance pasan correctamente, pero cuando quiero asignar el mock a la clase Delivery le tira el error antes mostardo.
Mi pregunta es: Se puede hacer lo que quiero hacer? Si es asi, alguien me puede tirar un soga para resolverlo?
Desde ya muchas gracias....
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20121203/3067fc1b/attachment.html>
More information about the pyar
mailing list