[pyar] Como mockear un iterable con mockito?

Gabriel gepatino en gmail.com
Jue Jun 14 15:15:12 ART 2012


Buenas gente, a ver si alguien me da una mano con algo que no puedo
resolver, pero no creo que sea tan complicado tampoco.

Quiero testear un pedazo de codigo donde estoy iterando un cursor luego de
hacer una query, algo asi:

def funcion(cursor):
    cursor.execute('SELECT * FROM blabla')
    for row in cursor:
        do_something
    return something


Antes esta funcion no recorria todos los resultados, sino que usaba solo la
primer fila, por lo que estabamos usando el metodo cursor.fetchone(), y
para los tests estabamos haciendo un mock que nos devolvia una fila
ficticia:

def test_blabla():
    cursor = mock()
    when(cursor).fetchone().thenReturn({'id': 1, 'name': 'pepe'})
    res = funcion(cursor)
    ... asserts, etc


El tema es que al cambiar de pedir una fila a recorrerlas todas, deberia
reescribir el metodo __iter__ del cursor mock, pero aparentemente no
funciona. Probe haciendo una clase iterable que simule ser un cursor, pero
al mockearla, todos sus metodos son remplazados por un metodo vacío por lo
que fallan al querer iterarlo.

No importa lo que invente siempre termino en un TypeError: 'mock' object is
not iterable

Puede ser que este atacando esto desde el lado equivocado, pero no le paso
a nadie antes? Me costó mucho encontrar algo de info, y lo que encuentro
tampoco responde especificamente a este tema.

Si el enfoque esta totalmente errado, cual sería la forma correcta de
probar algo asi?
La respuesta que encontré es que deberías tener una copia de tu db para
hacer tests, lo cual no me gusta mucho porque ya lo estamos haciendo y es
un problema (se rompen los tests si cambia algo en los datos, si esta caido
el servicio, etc). Encima, en este caso en particular estamos verificando
temas de GRANTS, entonces es mas facil inventar a mano los casos de prueba
en algun tipo de mock que definir todos los grants en una db de prueba.

Se escucha todo tipo de ideas/sugerencias.

Gracias
-- 
Gabriel E. Patiño
http://about.me/gepatino
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20120614/5f45bd39/attachment.html>


More information about the pyar mailing list