Testeando respuestas JSON con Grails
Aunque en la documentación de Grails aparece un ejemplo de como escribir un test para una acción que recibe una petición en formato XML o JSON, no lo hace de como escribir un test de una acción que genera el JSON, que tampoco es que sea precisamente complicado.
Si lo único que quisieramos probar es que, en una cadena JSON, se está devolviendo algún valor que estuvieramos esperando, podríamos utilizar el contenido que devuelve la response como una cadena(con contentAsString) y hacer alguna comprobación sobre el texto:
def response = controller.response.contentAsString
assertTrue response.contains('"name":"Gustavo Poyet"')
assertTrue response.contains('"goals":63')
Pero claro, este test es un muy ligero y no prueba demasiado. Si quisieramos probar más a fondo la respuesta(estructura, un elemento concreto de un array, etc), podríamos usar contains sobre la cadena devuelta, convertir tipos… vamos, que sería más que posible que el código del test terminara siendo infumable. Pero está disponible out of the box el converter JSON de Grails, que permite testear más a fondo fácilmente y con un código mucho más claro.
Es muy posible que si alguien se ve en la necesidad de escribir un test para una acción que devuelve un JSON, ya conozca el converter, por que es una de las alternativas que hay para hacerlo:
render object as JSON
Pues esa misma clase, tiene el paso contrario, pasar una cadena a un objeto groovy/java(JSONElement). De esta forma ya nos ahorraremos trabajo sucio y el código quedará bastante claro:
def response = controller.response.contentAsString
def responseJSON = grails.converters.JSON.parse(response)
assertNotNull responseJSON.players
assertEquals 5, responseJSON.players.size()
assertEquals 63, responseJSON.players[0].goals
assertEquals "Gustavo Poyet", responseJSON.players[0].name
November 20th, 2009 at 7:33 am
y que tal hubiera quedado un “responseJSON=parse response as JSONElement” ya para dejarlo en plan dsl total
me la apunto para cuando nos dejen jugar con grails aunque ahora que java va a tener closures igual ya no merece la pena
November 20th, 2009 at 9:44 am
Aiva !!! Dani, esta entrada sale cuando pulsas en la categoría “Java” aunque no este categorizada dentro de la misma.
De todas formas, no me había dado cuenta de la profundidad de tu blog hasta que he visto que tienes 160 entradas dentro de la categoría programación
November 20th, 2009 at 1:17 pm
@atreyu jejeje, entonces quizás portan grails a java “puro” XD
@David las categorías las tengo anidadas (grails en groovy, groovy en java y java en programación), creo que así resulta más fácil navegar en busca de contenido.
Me has hecho ir a mirar cuando empecé a escribir el blog… casi 3 años y medio! Eso sí, entre todos esos posts hay cosillas decentes/curiosas y otros son de “dudosa” calidad
November 20th, 2009 at 4:56 pm
Gracias por el truco Dani, me es bastante útil y me servirá de complemento a esto: http://jsonlint.com/, que lo uso para saber si el objeto está bien generado y poder verlo formateado.
Saludos
November 21st, 2009 at 1:15 am
Genial que te sirva Raúl!
Pero me quedo con la duda de si estás validando la salida de una acción de tu proyecto. Si es tuya supongo que por alguna razón, no estás utilizando las herramientas que aporta Grails y lo estás haciendo a mano, ¿o no?
November 22nd, 2009 at 2:35 pm
Efectivamente Dani, antes de conocer esto que comentas hacía la comprobación a manubrio.
Saludos
November 26th, 2009 at 11:30 pm
Oye Dani, lo he probado y no sólo va de lujo sino que además es muy cómodo y muy sencillo usarlo.
Gracias de nuevo por el truco y saludos
November 27th, 2009 at 2:16 am
Me alegro de que te sirva!
La verdad que en Grails he visto algunas cosillas muy chulas que no están documentadas, o un poco perdidas entre la documentación.