2012-03-30 61 views
2

我目前正試圖從教程中製作一個dropbox-esque應用程序,並且我無法弄清楚如何測試此控制器。測試對象是由current_user擁有或創建的

這是AssetsController頁

def index 
     @assets = current_user.assets 
    end 

    def show 
     @assets = current_user.assets.find(params[:id]) 

此外,資產belong_to:用戶和用戶的has_many:資產

我怎麼會去把那到一個RSpec測試?

回答

3

首先,要非常小心AssetsController。

假設您使用Rails 3,「assets_path」也是用於加載應用程序資產的路徑,因此,您在該控制器中寫入會話的任何內容都將被默認忽略。可能不是你想要的!我強烈地考慮重命名控制器。

我會首先創建一個登錄框的用戶

module ControllerMacros 
    def login_user 
    before(:each) do 
     @request.env["devise.mapping"] = Devise.mappings[:user] 
     @user = Factory.create(:user) 
     sign_in @user 
    end 
    end 
end 

然後,您可以在spec_helper.rb文件加載這個

RSpec.configure do |config| 
    config.include Devise::TestHelpers, :type => :controller 
    config.extend ControllerMacros, :type => :controller 
end 

最後,你可以在使用測試

describe MyController do 
    context "#index" do 
    login_user 
    before(:each) do 
     @assets = [] 
     5.times{ @assets << Factory.create(:asset, :user => @user)} 
    end 

    it "should test index" do 
     get :index 
     assigns(:assets).should eq(@assets) 
    end 
    end 
end 

現在,應該正確測試您的資產列表。

編輯:剛纔意識到,我在這裏使用FactoryGirl/Devise,你可能會也可能不會!

+0

我也使用factoryGirl/Devise,但我還沒有定義任何工廠。該工廠應該是什麼樣子?我已將控制器重命名爲TemplatesController – RubyNerd 2012-03-30 14:04:29

+0

我使用索引函數。對於演出功能來說,它幾乎是一回事嗎? – RubyNerd 2012-03-30 17:26:42

+0

只是一個筆記...測試通過只是把分配(:資產)...如果我把分配(:資產)。應該(QQ)(@assets)它失敗 – RubyNerd 2012-03-30 17:42:30

1

究竟是什麼問題?如何設置關係的基本測試或如何測試current_user的管理?

對此的基本測試應該在Model Specs中,因爲這是模型的工作來梳理這些事情。

我通常測試它是這樣的:

1)限定的固定裝置(或交替地使用兩個用戶和一些資產(3在這個例子中)類似FactoryGirl)。對於用戶資產被命名爲asset_a_ *,這些用戶B asset_b_ *)

2)測試僅僅是這樣的:

users(:users_a).assets.should have(3).records 
    users(:users_a).assets.should include(assets(:asset_a_a)) 
    users(:users_a).assets.should include(assets(:assets_a_b)) 
    users(:users_a).assets.should include(assets(:assets_a_c)) 

您可以微調這個喜歡 用戶(:users_a).assets。查找(資產(:asset_a_a).id)。應包括(assets(:asset_a_a)) users(:users_a).assets.find(assets(:asset_a_a).id).should_not include(assets(:asset_b_a))

如果您絕對想要,可以對控制器部件使用類似的測試。

雖然有相當多的討論,如果這些基本功能需要測試,因爲它主要是核心Rails功能來處理您在您的模型中定義的關聯。

我個人做這種測試的原因有些。在許多情況下,這種許可相關的協會很快變得更加複雜,無論如何都需要詳細的測試或者有人可能會改變關聯的參數並破壞某些東西。

II - 關於控制器內的current_user部分。

這當然取決於您如何處理身份驗證開始。如果你使用像AuthLogic這樣的插件(或其他),它可能有一些方法允許在rspec中模擬登錄。對於authlogic,你可以這樣做:

before(:each) do 
    activate_authlogic 
    UserSession.create(users(:user_a)) 
end 

這將激活authlogic和'login'user_a。 然後你運行你的控制器

get :index 
    response.should be_success 
    response.should render_template :index 
    assigns(:assets).should # => more or less as above, check that there are the right aessets.