2012-03-30 21 views
39

Voglio testare il rendering di un particolare parziale in base ad alcune condizioni.Come eseguire il rendering di rendering parziale con RSpec

Ad esempio, nel modello di spettacolo vista l'azione show.html.erb ho:

<% if condition1 %> 
<%= render :partial => "partial1" %> 
<% else %> 
<%= render :partial => "partial1" %> 
<% end %> 

ho provato:

response.should render_template("partial_name") 

ma dice che ha reso "spettacolo" modello

attesa < "partial1"> ma rendering con < "modello/spettacolo, layout /application ">

Cosa sto facendo male?

+2

https://www.relishapp.com/rspec/rspec-rails/v/2-8/docs/view-specs/view-spec – apneadiving

+1

ho bisogno di testare in controller_spec – Pavel

+0

'delegati render_template' a 'assert_template' in [action_controller/test_case.rb] (https: // github.com/rails/rails/blob/master/actionpack/lib/action_controller/test_case.rb # L67) quindi è qui che vive la documentazione più dettagliata –

risposta

61

Prova anche questo

 
response.should render_template(:partial => 'partial_name') 
+0

grazie, lo proverò ora – Pavel

+9

Funziona, ma devi specificare 'render_views' se stai scrivendo specifiche del controller. – Fabio

+0

Puoi espandere la cosa render_views? render_template non funziona per me nei test del controller. –

-3

Invece della suddetta soluzione si potrebbe verificare in alternativa, se è presente il codice html che rende il parziale. Per esempio.

response.body.should have_tag("div#foo") 
+1

Per me' response.body.should ... 'funziona. –

+2

sarebbe un test piuttosto fragile, in modo tale che il test fallirebbe se avessi cambiato l'html, ma quello che stai veramente testando è se il template debba essere reso o meno. – jbielick

+0

Spec dovrebbe testare il rendering del rendering parziale, non il corpo html. – Argonus

23

Ultima versione rspec suggeriscono di utilizzare expect sintassi piuttosto che should:

expect(response).to render_template(partial: 'partial_name') 
2

Se si verifica questo all'interno di un controlloresi dovrebbe fare qualcosa di simile:

RSpec.describe Users::RegistrationsController, type: :controller do 
    describe "GET #new" do 
    render_views 

    it "render customer partial" do 
     get :new 
     expect(response).to render_template :new 
     expect(response).to render_template(partial: '_new_customer') 
    end 
    end 
end 

Nota che abbiamo bisogno di rendering_views come riportato i nto documentation.

E questa è la linea che metterà alla prova se "_new_customer" parziale è resa:

expect(response).to render_template(partial: '_new_customer') 

è necessario fornire il nome del parziale con la sottolineatura iniziale.

Inoltre, fai attenzione perché nel tuo codice le istruzioni IF e ELSE stanno rendendo la stessa cosa.

+0

Dovresti davvero testare una vista in una specifica del controller? RSpec fornisce spec/views per questo; oppure potresti usare test di funzionalità/integrazione. –

+0

@KrisKhaira bene, potresti aver bisogno di entrambi. In una specifica del controller è possibile verificare che il controller esegua il rendering del modello/vista previsto. Quindi nei test di funzionalità/integrazione è possibile testare a fondo l'intero file, in particolare la vista per verificare se l'utente è in grado di eseguire le azioni previste. –

0

Se si utilizza nei controller RSpec

expect(response).to render_template(partial: 'home/_sector_performance') 
0

A partire da Rails 5.1, this kind of test is discouraged and you should test the controller and the view as a whole.

Controllare quale partial è reso dal controllato è parte dei dettagli di implementazione che non dovresti testare.

Pertanto, ti suggerisco di scrivere un test di richiesta e controllare che nel corpo della risposta sia presente del testo pertinente del tuo parziale.

get root_path 
expect(CGI.unescape_html(response.body)).to include('Hello World') 
Problemi correlati