2012-03-30 3 views
6

Sto cercando un modo pulito per utilizzare JBuilder e testare l'output di JSON con RSpec. Il metodo popolare per il test JSON consiste nell'implementare il metodo as_json, quindi in RSpec confrontare l'oggetto ricevuto con il metodo object.to_json. Ma una grande ragione per cui sto usando JBuilder è che non voglio tutti gli attributi che to_json sputa; quindi questo rompe il confronto.Come usare RSpec con JBuilder?

Attualmente con JBuilder sto avendo a che fare le seguenti operazioni per verificare i risultati RSpec:

1) Creare un oggetto di fabbrica: @venue

2) Creazione di un hash dentro la mia prova RSpec che contiene il "atteso" stringa JSON indietro

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

2) Confronta la stringa @expected al results.response.body che viene restituito dalla chiamata JSON.

Questo sembra semplice, tranne ho oggetti sono stati resi con 15+ attributi, e costruendo la stringa hash @expected è ingombrante e molto fragile. C'è un modo migliore per farlo?

+0

Ho fatto esattamente questo. Non riesco a pensare a un modo migliore per farlo. Ho costruito un hash e applicato '.to_json' su' @ expected'. Una cosa che accelero e renderla meno fragile. Forse a costo di precisione? Sta per costruire i miei hash con collect e map. Immagino che la natura specifica della creazione di un modello personalizzato con qualsiasi libreria di costruzione di stringhe JSON richieda di scrivere un test che corrisponda alle specifiche del lavoro che fai ..:/ – stuartc

+0

@beeudoublez sei in grado di utilizzare RSpec per testare le viste di jbuilder? Ho problemi a ottenere rspec per passare oggetti alla vista in modo che il gestore jbuilder possa costruire il JSON. Avete un esempio di lavoro sul file '* _spec.rb'? – sorens

risposta

4

Si dovrebbe essere in grado di testare le vostre opinioni JBuilder con RSpec viste specifiche. Puoi vedere i documenti allo https://www.relishapp.com/rspec/rspec-rails/v/2-13/docs/view-specs/view-spec.

Una specifica di esempio per un file che si trova in "app/views/api/users/_user.json.jbuilder", potrebbe essere qualcosa del genere (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

questo suona come un buon caso d'uso per RSpec vista spec. Stai usando JBuilder per l'output di un controller nelle viste?

Per esempio, in spec/views/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

non sono stato in grado di fare RSpec lavorare con i punti di vista ancora, ma sto testando il mio JSON API tramite test RSpec controller. Per aiutare con questo processo, sto usando il api matchers gem. Questo gioiello permette di costruire i test RSpec come ad esempio:

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

non mi piace testare l'API JSON attraverso il punto di vista, perché si deve essenzialmente mimica, nel test, la messa a punto già fatto nel controller. Inoltre, ignorando il controller, non stai realmente testando l'API.

Nei test del controller, però, vi accorgerete che non si ottiene alcun JSON restituito nel corpo di risposta. Il corpo della risposta è vuoto. Questo perché RSpec disabilita il rendering della vista nei test del controller. (Per meglio o peggio.)

Al fine di avere un test di controllo RSpec della vostra vista renderizzata JSON API, è necessario aggiungere la direttiva render_views nella parte superiore del tuo test. Vedi this blog post (non il mio), per informazioni più dettagliate sull'uso dei test del controller RSpec con Jbuilder.

Inoltre, vedere this answer.