2012-11-10 6 views
10

레일 3 레이아웃에서 로직을 테스트하는 가장 좋은 방법은 무엇입니까?RSpec을 사용하여 레이아웃 테스트

예 : 사용자가 내 사이트에 로그인 할 때 온 보딩 프로세스를 완료하지 않은 경우 모든 페이지의 화면 상단에 알림을 표시합니다. 이 로직은 애플리케이션 레이아웃에 배치되었습니다. 로그인 한 사용자가 특정 키를 확인하기 만하면됩니다. 키가 없으면 경고를 표시합니다. 열쇠가 표시되면 (즉, 온 보딩을 완료했음을 의미) 경보를 표시하지 않습니다.

현재 뷰 테스트에서이 작업을 시도하고 있지만 응용 프로그램 레이아웃을 포함하여 모든 종류의 Nil : NilClass 오류를 인증하고이 기능을 테스트하는 것 같습니다.

내 devs 중 하나가 실수로이 기능을 깨뜨린 경우 (온 보딩으로 표시되는보기가 완료되지 않음) 우리는 빌드를 즉시 알 필요가 있기 때문에 테스트 중이라는 것을 확인해야합니다.

내 레이아웃에 테스트 할 노력하고있어 코드는 다음과 같습니다 : 나는 그들이 보딩 경우 자세한 내용은이 메시지가 표시됩니다 것을 제공되지 않은 있는지 확인하려면

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

과 그들이 가지고있는 경우 이 메시지를 표시하지 마십시오.

답변

14

다른보기와 마찬가지로 레이아웃을 테스트 할 수 있습니다. 그냥 파일 application.html.erb_spec.rbspec/views/layouts/에서 (필요한 경우 haml에 의해 erb 교체)를 만들고, 그 파일에 예를 들어, 평소대로 사양을 쓸 :

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 

내 애플 리케이션 중 하나를 사용하여이 작업을 수행하고이 더 작동 문제, 그래서 나는 왜 그것이 당신의 경우에도 작동하지 않을지 모르겠다.

2

ActionView::Template::Error: undefined method authenticate for nil:NilClass의 오류는보기에서 user_signed_in? 메서드 호출로 인해 발생합니다. @shioyama가 코드에서 보여준대로 user_signed_in? 메소드를 테스트하여이 문제를 처리 할 수 ​​있습니다.

다음 코드는 user_signed_in? 방법을 스텁 당신이하지 않으면 당신은 false을 실행하기 위해보기에서 if 문을 원하는 경우 또는 true을 반환하는 방법을 보여줍니다. view.stub(:user_signed_in?).and_return(true)

관련 문제