Comment vérifier une réponse JSON à l'aide de RSpec?
J'ai le code suivant dans mon controller:
format.json { render :json => {
:flashcard => @flashcard,
:lesson => @lesson,
:success => true
}
Dans mon RSpec contrôleur de test je veux vérifier qu'un certain scénario n'recevoir une réussite réponse json, donc j'ai eu la ligne suivante:
controller.should_receive(:render).with(hash_including(:success => true))
Bien que quand je lance mes tests, j'obtiens l'erreur suivante:
Failure/Error: controller.should_receive(:render).with(hash_including(:success => false))
(#<AnnoController:0x00000002de0560>).render(hash_including(:success=>false))
expected: 1 time
received: 0 times
Suis-je la vérification de la réponse incorrecte?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez examiner la réponse de l'objet et vérifiez qu'il contient la valeur attendue:
MODIFIER
Changer le présent pour un
post
le rend un peu plus compliqué. Voici une façon de le gérer:Noter que
mock_model
ne permettra pas de répondre àto_json
, donc soitstub_model
ou d'une véritable instance du modèle est nécessaire.post :create
avec un valide les paramètres de hachage.post :create, :format => :json
{"a":"1","b":"2"}
et{"b":"2","a":"1"}
ne sont pas égaux de chaînes de transcrire les objets égaux. Vous ne devriez pas comparer des chaînes de caractères, mais des objets, n'JSON.parse('{"a":"1","b":"2"}').should == {"a" => "1", "b" => "2"}
à la place.Vous pu analyser le corps de la réponse comme ceci:
Ensuite, vous pouvez faire vos affirmations contre analysé le contenu.
b = JSON.parse(response.body, symoblize_names: true)
de sorte que vous pouvez accéder en utilisant les symboles de la sorte:b[:foo]
Construction de Kevin Trowbridge réponse
Mime::JSON
au lieu de'application/json'
?Mime::JSON.to_s
Il y a aussi le json_spec gem, qui vaut un coup d'oeil
https://github.com/collectiveidea/json_spec
Simple et facile à moyen pour ce faire.
JSON(str)
fonctionne pour moi. MerciUne autre approche de test juste pour une réponse JSON (non pas que le contenu contient une valeur attendue), consiste à analyser la réponse à l'aide de ActiveSupport:
Si la réponse n'est pas analysée JSON une exception sera levée et le test échouera.
Vous pouvez regarder dans le
'Content-Type'
- tête pour voir que c'est correct?render :json => object
, je crois Rails renvoie une-tête Content-Type "application/json".response.header['Content-Type'].should match /json/
Vous pouvez également définir une fonction d'assistance à l'intérieur de
spec/support/
et l'utilisation
json_body
quand vous en avez besoin pour accéder à la réponse JSON.Par exemple, à l'intérieur de votre demande spec, vous pouvez l'utiliser directement
Lors de l'utilisation de Rails 5 (actuellement encore en version bêta), il y a une nouvelle méthode,
parsed_body
sur la réponse du test, qui sera de retour la réponse analysée comme ce que la dernière demande a été encodée à.Le commit sur GitHub: https://github.com/rails/rails/commit/eee3534b
#parsed_body
. Il n'est pas encore documentée, mais au moins le format JSON œuvres. Notez que les clés sont toujours des chaînes de caractères (au lieu de symboles), de sorte que l'on peut trouver sur#deep_symbolize_keys
ou#with_indifferent_access
utile (j'aime bien le dernier).Si vous voulez prendre avantage de la table de hachage diff Rspec, il est préférable d'analyser le corps et de le comparer à l'encontre d'un hachage. Façon la plus simple que j'ai trouvé:
J'ai trouvé un client matcher ici: https://raw.github.com/gist/917903/92d7101f643e07896659f84609c117c4c279dfad/have_content_type.rb
Mettre en spec/support/rapprochement/have_content_type.rb et assurez-vous de charger des trucs de soutenir avec quelque chose comme ça en vous spec/spec_helper.rb.rb
Voici le code lui-même, juste au cas où il a disparu à partir du lien donné.