2012-11-10 4 views
10

Qual è il modo migliore per testare la logica in un layout di rails 3?Utilizzo di RSpec per provare un layout

Esempio: quando un utente accede al mio sito, se non ha completato il processo di registrazione, visualizzo un avviso nella parte superiore dello schermo su TUTTE le pagine. Questa logica è stata inserita nel layout dell'applicazione. Semplicemente controllo l'utente che ha effettuato l'accesso per una determinata chiave. Se la chiave NON è presente, mostro l'avviso. Non appena la chiave è presente (nel senso che hanno completato l'onboarding) NON mostro l'avviso.

Attualmente sto tentando di farlo con un test di visualizzazione, ma sto ricevendo tutti i tipi di errori ActionView::Template::Error: undefined method autenticare "per nil: NilClass" includendo il layout dell'applicazione e non riesco a provare questa funzionalità.

Ho bisogno di assicurarmi di averlo sotto test perché se per qualche ragione uno dei miei sviluppatori rompe accidentalmente questa funzione (la visualizzazione mostrata con onboarding non è completa) dobbiamo sapere subito dopo la compilazione.

Il codice che sto cercando di testare nel mio layout è simile al seguente:

<% if user_signed_in? %> 
    <% unless current_user.has_completed_onboarding? %> 
     <div class="alert"> 
     You cannot accept payments from your clients until you set up your payment gateway. 
     <%= link_to "Set up your", payment_gateway_path %> payment gateway. Its quick, we promise. :) 
     </div> 
    <% end %> 
<% end %> 

voglio fare in modo che se ne onboarding dettagli sono stati forniti non che questo messaggio verrà visualizzato e se hanno stato fornito, quindi non mostrare questo messaggio.

risposta

14

È possibile testare il layout come qualsiasi altra vista. Basta creare un file application.html.erb_spec.rb (sostituire erb da haml se necessario) in spec/views/layouts/, e in quel file scrivere le vostre specifiche come si farebbe normalmente, ad esempio:

require 'spec_helper' 

describe 'layouts/application' do 

    context 'signed-in user' do 

    before { view.stub(:user_signed_in?) { true } } 

    context 'completed onboarding' do 

     before do 
     user = double('user') 
     user.stub(:has_completed_onboarding?) { false } 
     assign(:current_user, user) 
     end 

     it "should display alert" do 
     render 
     rendered.should have_selector('.alert') 
     end 

    end 

    ... 

    end 

    context 'signed-out user' do 
    ... 
    end 

    ... 

end 

Lo faccio con una delle mie applicazioni e non funziona problema, quindi non vedo perché non funzionerebbe anche per il tuo caso.

2

L'errore che si ottiene ActionView::Template::Error: undefined method authenticate for nil:NilClass è causato dalla chiamata del metodo user_signed_in? nella visualizzazione. Puoi gestirlo con lo stubing del metodo user_signed_in? nei tuoi test come mostrato da @shioyama nel codice.

Il codice seguente mostra come il metodo stub user_signed_in? e tornare true se si voleva la dichiarazione if in immagine per essere eseguito o false se non lo fai. view.stub(:user_signed_in?).and_return(true)