rails elaborando crear con apis ruby-on-rails json tdd

ruby-on-rails - elaborando - crear un api con ruby on rails



¿Cómo probar el resultado JSON de las pruebas funcionales de Ruby on Rails? (8)

Como se señaló, utiliza JSON.parse para probar el JSON, pero el lugar donde realiza esa afirmación depende de cómo esté procesando el JSON.

Si está generando el JSON en el controlador, analiza el JSON en las pruebas funcionales del controlador (como se muestran las otras respuestas). Si está renderizando JSON, con una vista usando Jbuilder , rabl u otra gema que adopta este enfoque, entonces analizar el JSON en la unidad de visualización no prueba las pruebas funcionales del controlador. Las pruebas unitarias generalmente son más rápidas de ejecutar y más fáciles de escribir, por ejemplo, puede construir modelos en la memoria en lugar de crearlos en la base de datos.

¿Cómo puedo hacer valer mi solicitud Ajax y probar la salida JSON de las pruebas funcionales de Ruby on Rails?


En realidad, puedes usar implícitamente el módulo JSON:

assert_equal assigns(:user).to_json, @response.body


Ninguna de las respuestas proporciona una buena forma de mantenimiento para verificar una respuesta JSON. Encuentro que este es el mejor:

https://github.com/ruby-json-schema/json-schema

Proporciona una implementación agradable para el esquema json estándar

Puedes escribir un esquema como:

schema = { "type"=>"object", "required" => ["a"], "properties" => { "a" => { "type" => "integer", "default" => 42 }, "b" => { "type" => "object", "properties" => { "x" => { "type" => "integer" } } } } }

y úsalo como: JSON::Validator.validate(schema, { "a" => 5 })

La mejor manera de verificarlo contra mi implementación de cliente de Android.


Puede usar la gema AssertJson para obtener una buena DSL que le permite verificar las claves y los valores que deberían existir en su respuesta JSON.

Agrega la gema a tu Gemfile :

group :test do gem ''assert_json'' end

Este es un ejemplo rápido de cómo podría ser su prueba funcional / de controlador (el ejemplo es una adaptación de su README ):

class ExampleControllerTest < ActionController::TestCase include AssertJson def test_my_action get :my_action, :format => ''json'' # => @response.body= ''{"key":[{"inner_key":"value1"}]}'' assert_json(@response.body) do has ''key'' do has ''inner_key'', ''value1'' end has_not ''key_not_included'' end end end

Solo tiene que incluir el módulo AssertJson en su prueba y usar el bloque assert_json donde puede verificar la respuesta para las claves y valores existentes y no existentes. Sugerencia: no se ve de inmediato en el README , pero para verificar un valor (por ejemplo, si su acción solo devuelve una matriz de cadenas) puede hacer

def test_my_action get :my_action, :format => ''json'' # => @response.body= ''["value1", "value2"]'' assert_json(@response.body) do has ''value1'' has ''value2'' has_not ''value3'' end end


Rails tiene soporte JSON integrado:

def json_response ActiveSupport::JSON.decode @response.body end

No es necesario un complemento

Entonces puedes hacer algo como esto:

assert_equal "Mike", json_response[''name'']



También para respuestas cortas de JSON, simplemente puede hacer coincidir una cadena de JSON con @ response.body. Esto evita tener que depender de otra gema más.

assert_equal ''{"total_votes":1}'', @response.body


Utilice JSON.parse de la gema JSON , que toma una cadena como entrada y devuelve un hash Ruby que representa el JSON.

Aquí está la esencia básica de una prueba:

user = JSON.parse(@response.body) assert_equal "Mike", user[''name'']

Aquí hay documentación para la gema: http://json.rubyforge.org/ . Además, puedes jugar con la joya JSON en IRB bastante facilidad.