2012-11-10 10 views
10

Jaki jest najlepszy sposób testowania logiki w układzie szyn 3?Korzystanie z protokołu RSpec w celu przetestowania układu

Przykład: gdy użytkownik zaloguje się na mojej stronie, jeśli nie zakończył procesu wprowadzania, pokazuję im alert u góry ekranu na WSZYSTKICH stronach. Ta logika została umieszczona w układzie aplikacji. Po prostu sprawdzam zalogowanego użytkownika pod kątem określonego klucza. Jeśli klucz NIE jest obecny, wyświetlam ostrzeżenie. Gdy tylko klucz jest obecny (co oznacza, że ​​ukończył proces instalacji), NIE pokazuję ostrzeżenia.

Obecnie próbuję zrobić to z testem widoku, ale otrzymuję wszelkiego rodzaju ActionView::Template::Error: undefined method uwierzytelnianie "dla zer: NilClass" błędów poprzez włączenie układu aplikacji i nie mogę przetestować tej funkcji.

Muszę się upewnić, że mam to pod kontrolą, ponieważ jeśli z jakiegoś powodu jeden z moich programistów przypadkowo zepsuje tę funkcję (widok pokazujący się z wprowadzeniem nie jest kompletny), musimy wiedzieć od razu po kompilacji.

Kod, który próbuję przetestować na moim układ wygląda następująco:

<% 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 %> 

chcę, aby upewnić się, że jeśli Onboarding szczegóły nie zostały przewidziane, że ta wiadomość pojawi i czy mają zostały dostarczone, a następnie nie wyświetlaj tej wiadomości.

Odpowiedz

14

Możesz przetestować swój układ, tak jak każdy inny widok. Wystarczy utworzyć plik application.html.erb_spec.rb (zastąpi erb przez haml jeśli to konieczne) w spec/views/layouts/, w tym pliku napisać swoje widowisko jak zwykle, np:

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 

zrobić to z jednym z moich aplikacji i to nie działa problem, więc nie rozumiem, dlaczego to nie zadziałałoby również w twoim przypadku.

2

Błąd, który otrzymałeś ActionView::Template::Error: undefined method authenticate for nil:NilClass jest spowodowany wywołaniem metody user_signed_in? w widoku. Możesz sobie z tym poradzić, wciskając w testach metodę user_signed_in?, tak jak pokazano w kodzie @shioyama.

Poniższy kod pokazuje jak skrótową metody user_signed_in? i powrócić true jeśli chciał oświadczenie if Państwa zdaniem mają być wykonane lub false jeśli nie. view.stub(:user_signed_in?).and_return(true)

Powiązane problemy