2008-12-03 14 views

Respuesta

75

Utilice el 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 para una prueba:

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

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

+0

agradable y fácil - gracias :) –

3

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 
79

Carriles tiene soporte JSON construido en:

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

No hay necesidad de un plugin

A continuación, puede hacer algo como esto:

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

Para obtener un rendimiento, es probable que quieren algo como: @json_response || = ActiveSupport :: JSON.decode @ response.body –

+6

Alex: ¿No sería eso caché la respuesta de la primera probar y devolver eso en todas las siguientes pruebas JSON? – iGEL

+2

Esto almacenará en caché la respuesta para todas las solicitudes dentro de una función de prueba, lo que puede no ser un efecto deseable. Para aclarar, no almacenaría en caché las pruebas ACROSS. – WattsInABox

1

En realidad, se puede utilizar de forma implícita el módulo JSON:

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

Puede utilizar el AssertJson gem para un buen DSL que le permite comprobar si hay claves y valores que deben existir en su JSON respuesta.

Añadir la gema a su Gemfile:

group :test do 
    gem 'assert_json' 
end 

Este es un ejemplo rápido de cómo su prueba de funcionamiento/controlador podría parecerse a (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 a las claves y valores existentes y no existentes. Sugerencia: no es inmediatamente visible en el README, pero para comprobar si un valor (por ejemplo, si su acción sólo devuelve una matriz de cadenas) que 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 
+0

Muy agradable. Acabo de contribuir con pequeñas correcciones de errores. – gertas

+1

Recomiendo no usar ese GEM. Tiene muchos problemas. – Zack

1

Como se ha señalado, se utiliza para probar la JSON.parse JSON , pero donde lleva a cabo esa afirmación depende de cómo está renderizando 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á procesando JSON, con una vista usando Jbuilder, rabl u otra gema que adopta este enfoque, entonces parse the JSON in the view unit tests no las pruebas funcionales del controlador. Las pruebas unitarias generalmente son más rápidas de ejecutar y más fáciles de escribir, por ej., puede construir modelos en memoria en lugar de crearlos en la base de datos.

0

Ninguna de las respuestas proporciona una buena forma de mantenimiento para verificar una respuesta JSON. Me parece que éste sea el mejor:

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

Proporciona una buena aplicación de la norma json schema

Puede escribir un esquema como:

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

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

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

Cuestiones relacionadas