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'']
Si está utilizando RSpec, vale la pena mirar json_spec
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.