[pyar] Django + Testing unitario

Daniel Moisset dmoisset en machinalis.com
Mie Dic 5 11:57:07 ART 2012


No esta muy claro que uso querés hacer, pero normalmente lo que haces es
hacer un Mock de las cosas que NO queres testear

O sea, si queres hacer tests sobre Student y Practice, y ponele que llaman
a un metodo de Teacher que no queres que se ejecute duranet el test, haces
un mock de Teacher (o de su metodo), pero dejas Student y Practice tal cual.

Otra cosa que no tiene que ver con tu pregunta:

Tu código

*       isinstance(self.student, Student)*
*       isinstance(self.practice, Practice)*

No hace nada (evalúa algo y tira el resultado, sin importar si fue
verdadero o falso). Si lo que querés es que el test verifique que sean
instancias, podés hacer:

self.assertTrue(isinstance(self.studen, Student))

Saludos,
   Daniel



2012/12/5 Martin Zucchiatti Hotmail <tanomartin05 en hotmail.com>

>   Hernan, te agradezco nuevamente tu tiempo y vuelvo a darle vida a mi
> consulta....
>
> Si cambiamos el test por lo siguiente
>  **
> *class DeliveryTest(TestCase):*
> *   def setUp(self):*
> **
> *      #self.student = MagicMock(spec=Student)*
> ***       self.student = Student()*
> ***       self.student.name = "Nombre y Apellido"*
> **
> **
> *****       #self.practice = MagicMock(spec=Practice)*
> *       self.practice = 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)*
> **
>
> En el código cambiamos el MagicMock por el verdadero constructor de la
> clase y el test anda perfecto.
> Lo que quiero saber es si se puede suplir al constructor de la clase por
> el Mock para solo utilizar funciones de la clase la cual estoy testeando.
>  Desde ya muchas gracias por su ayuda
>
> Martin
>
>  *From:* Aníbal Lovaglio <aniballovaglio en yahoo.com.ar>
> *Sent:* Wednesday, December 05, 2012 12:40 AM
> *To:* Python Argentina <pyar en python.org.ar>
> *Cc:* sercom2012 en googlegroups.com
> *Subject:* Re: [pyar] Django + Testing unitario
>
>  Hola Hernán,
> gracias por la respuesta, lo voy a probar ni bien pueda y comento a ver
> como fue.
> Saludos!
>
>   ------------------------------
> *De:* Hernan Lozano <hernantz en gmail.com>
> *Para:* Python Argentina <pyar en python.org.ar>
> *Enviado:* martes, 4 de diciembre de 2012 8:58
> *Asunto:* Re: [pyar] Django + Testing unitario
>
> 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
>
>
>
> _______________________________________________
> 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
>
>  ------------------------------
> _______________________________________________
> 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
>
>
> _______________________________________________
> 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/20121205/62ede975/attachment.html>


More information about the pyar mailing list