[pyar] Django + Testing unitario

Aníbal Lovaglio aniballovaglio en yahoo.com.ar
Mie Dic 5 00:40:19 ART 2012


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 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....
>
>
>_______________________________________________
>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/20121204/3358aab6/attachment.html>


More information about the pyar mailing list