[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