2012-11-10 119 views
10

在rails 3佈局中測試邏輯的最佳方法是什麼?使用RSpec測試佈局

示例:當用戶登錄我的網站時,如果他們還沒有完成入職流程,我會在所有頁面的屏幕頂部向他們顯示一條提醒。這個邏輯被放置到應用程序佈局中。我只需檢查登錄的用戶是否有特定的密鑰。如果鑰匙不存在,我會顯示警報。一旦鑰匙出現(意味着他們已經完成入職),我不會顯示警報。

目前我試圖做一個視圖測試,但我得到各種ActionView::Template::Error: undefined method通過包括應用程序佈局驗證'爲零:NilClass`錯誤,我似乎無法測試此功能。

我需要確保我有這個測試,因爲如果由於某種原因,我的一個開發人員意外地破壞了這個功能(視圖顯示與入職不完整),我們需要立即知道構建。

,我試圖在我的佈局要測試的代碼如下所示:

<% 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?方法並返回true,如果你在你看來希望if語句被執行或false如果你不這樣做。 view.stub(:user_signed_in?).and_return(true)