[pyar] Django + Testing unitario
Hernan Lozano
hernantz en gmail.com
Mar Dic 4 08:58:21 ART 2012
Hola!
creo que error viene porque en el metodo __str__ de Delivery
estas llamando al __str__ de Student.
Como Delivery tiene un foreign key hacia un objeto Student, el ORM
va a tratar de buscar ese objeto en la base de datos.
No se muy bien como funciona el MagicMock pero el objeto que estas
pasandole a tu Delivery() en el test no es un Student que herede de
django.models.Model,
y por ende no tiene el atributo _state.
Mi sugerencia es probar sin un mock a ver que sale.
2012/12/3 Aníbal Lovaglio <aniballovaglio en yahoo.com.ar>
> 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 testDeliveryToStringReturnNamePracticeNameStudentAndDeadLine
> Practice*
> * 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....
>
>
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> Argentina - http://www.usla.org.ar
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20121204/7cba664e/attachment.html>
More information about the pyar
mailing list