2012-03-30 4 views
6

Je cherche un moyen propre d'utiliser JBuilder et tester la sortie json avec RSpec. Le moyen le plus répandu pour tester JSON est d'implémenter la méthode as_json, puis de comparer l'objet reçu avec la méthode object.to_json dans RSpec. Mais une grande raison pour laquelle j'utilise JBuilder est que je ne veux pas tous les attributs que to_json recrache; donc cela casse la comparaison.Comment utiliser RSpec avec JBuilder?

Actuellement avec JBuilder Je vais avoir à faire ce qui suit pour tester les résultats RSpec:

1) Créer un objet usine: @venue

2) Créer un hachage à l'intérieur de mon test RSpec qui contient la "attendu" string JSON retour

@expected => {:id => @venue.id,:name=>@venue.name..........} 

2) Comparer la chaîne @expected à la results.response.body qui est renvoyée par l'appel JSON.

Cela semble simple, sauf que j'ai des objets rendus avec plus de 15 attributs, et la construction de la chaîne de hachage @expected est lourde et très fragile. Y a-t-il une meilleure manière de faire cela?

+0

Je fais exactement cela. Je ne peux pas penser à une meilleure façon de le faire. J'ai construit un hachage et j'applique '.to_json' sur' @ expected'. Une chose que j'accélère et que je rends moins cassante. Peut-être au prix de l'exactitude? Est de construire mes hachages avec recueillir et carte. Je suppose que la nature spécifique de la construction de modèle personnalisé avec une bibliothèque de construction de chaînes JSON vous oblige à écrire un test qui correspond aux spécificités du travail que vous faites ..:/ – stuartc

+0

@beeudoublez êtes-vous capable d'utiliser RSpec pour tester les vues jbuilder? J'ai du mal à faire passer des objets à la vue par rspec pour que le gestionnaire jbuilder puisse construire le JSON. Avez-vous un exemple de fichier '* _spec.rb' de vue de travail? – sorens

Répondre

4

Vous devriez être en mesure de tester vos vues Jbuilder avec vue RSpec spécifications. Vous pouvez voir les documents au https://www.relishapp.com/rspec/rspec-rails/v/2-13/docs/view-specs/view-spec.

Un exemple de spécification pour un fichier situé dans 'app/views/api/users/_user.json.jbuilder', pourrait être quelque chose comme ceci (spec/views/api/users/_user.json.jbuilder_spec.rb) :

require 'spec_helper' 

describe 'user rendering' do 
    let(:current_user) { User.new(id: 1, email: '[email protected]') } 

    before do 
    view.stub(:current_user).and_return(current_user) 
    end 

    it 'does something' do 
    render 'api/users/user', user: current_user 

    expect(rendered).to match('[email protected]') 
    end 
end 
1

Cela ressemble à un bon cas d'utilisation pour les spécifications de vue RSpec. Utilisez-vous JBuilder pour la sortie d'un contrôleur dans les vues?

Par exemple, dans les spécifications/vues/venues_spec.rb

require 'spec_helper' 
describe "venues/show" do 
    it "renders venue json" do 
    venue = FactoryGirl.create(:venue) 
    assign(:venue, venue]) 
    render 
    expect(view).to render_template(:partial => "_venue") 
    venue_hash = JSON.parse(rendered) 
    venue_hash['id'].should == @venue.id 
    end 
end 
1

Je n'ai pas été en mesure de faire RSpec travailler avec les vues encore, mais je teste mon API JSON via le contrôleur des tests RSpec. Pour aider à ce processus, j'utilise le api matchers gem. Ce petit bijou vous permet de construire des tests RSpec tels que:

it "should have a 200 code" do 
    get :list, :format => :json 
    response.should be_success 
    response.body.should have_json_node(:code).with("200") 
    response.body.should have_json_node(:msg).with("parameter missing") 
end 
1

Je n'aime pas tester l'API JSON à travers les vues, parce que vous avez essentiellement mimétique, dans le test, la configuration déjà fait dans le contrôleur. En outre, en contournant le contrôleur, vous ne testez pas vraiment l'API. Dans les tests de contrôleur, cependant, vous ne trouverez aucun JSON renvoyé dans le corps de la réponse. Le corps de la réponse est vide. Cela est dû au fait que RSpec désactive le rendu de la vue dans les tests du contrôleur. (Pour le meilleur ou pour le pire.)

Afin d'avoir un test de contrôleur RSpec de votre API JSON rendue, vous devez ajouter la directive render_views au début de votre test. Voir this blog post (pas le mien), pour plus d'informations sur l'utilisation des tests du contrôleur RSpec avec Jbuilder.

Voir aussi this answer.