web-dev-qa-db-fra.com

Comment tester le résultat JSON à partir des tests fonctionnels de Ruby on Rails?

Comment puis-je affirmer ma Ajax demander et tester la sortie JSON des tests fonctionnels de Ruby on Rails?

67
William Yeung

Utilisez le fichier JSON.parse du fichier JSON gem, qui prend une chaîne en tant qu'entrée et renvoie un hachage Ruby que le code JSON représente.

Voici le Gist de base pour un test:

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

Voici la documentation pour le joyau: http://json.rubyforge.org/ . En outre, vous pouvez jouer avec la gemme JSON dans IRB assez facilement.

79
nicholaides

Rails a un support JSON intégré dans:

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

Pas besoin de plugin

Ensuite, vous pouvez faire quelque chose comme ça:

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

Si vous utilisez RSpec, json_spec vaut le détour

https://github.com/collectiveidea/json_spec

6
acw

De même, pour les réponses JSON courtes, vous pouvez simplement faire correspondre une chaîne du JSON à @ response.body. Cela évite d'avoir à compter sur un autre joyau.

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

Comme indiqué précédemment, vous utilisez JSON.parse pour tester le code JSON, mais l'emplacement où vous effectuez cette assertion dépend de la manière dont vous calculez le code JSON.

Si vous générez le JSON dans le contrôleur, vous analysez le JSON dans les tests fonctionnels du contrôleur (comme le montrent les autres réponses). Si vous rendez le rendu JSON, avec une vue utilisant Jbuilder , rabl ou une autre gem utilisant cette approche, parsez le JSON dans l'unité de la vue teste et non les tests fonctionnels du contrôleur. Les tests unitaires sont généralement plus rapides à exécuter et plus faciles à écrire - vous pouvez par exemple créer des modèles en mémoire plutôt que de les créer dans la base de données.

1
Jay Mitchell

En réalité, vous pouvez utiliser implicitement le module JSON:

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

Dans les nouvelles versions de Rails, vous pouvez utiliser parsed_body pour accéder à cela dans vos tests sans aucun travail.

L'appel de parsed_body sur la réponse analyse le corps de la réponse en fonction du type MIME de la dernière réponse.

Hors de la boîte, seulement: JSON est pris en charge. Mais pour tous les types MIME personnalisés que vous avez enregistrés, vous pouvez ajouter vos propres encodeurs ...

https://api.rubyonrails.org/v5.2.1/classes/ActionDispatch/IntegrationTest.html

0
Mark G.

Aucune des réponses ne fournit un moyen facile et maintenable pour vérifier une réponse JSON. Je trouve que celui-ci est le meilleur:

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

Il fournit une implémentation de Nice pour le schéma standard json

Vous pouvez écrire un schéma comme:

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

et l'utiliser comme: JSON::Validator.validate(schema, { "a" => 5 })

Meilleur moyen de le vérifier par rapport à la mise en œuvre de mon client Android.

0
vedant