2012-03-30 2 views
2

現在、チュートリアルからDropbox-esqueアプリケーションを作成しようとしていますが、このコントローラのテスト方法を理解するのに問題があります。ユーザーとユーザーhas_manyの::資産オブジェクトがcurrent_userによって所有または作成されていることのテスト

どのように私はRSpecのテストにそれを置くことについて行くだろう

これは

def index 
     @assets = current_user.assets 
    end 

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

また、資産belong_to AssetsControllerページですか?

答えて

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

+0

私は動作するインデックス関数を持っています。ショーの機能とほとんど同じことでしょうか? – RubyNerd

+0

ちょうどメモ...テストは合格(:資産)...私は割り当て(:資産).shouldイク(@assets)それが失敗した場合にのみ渡します。 – RubyNerd

1

あなたは何を正確に質問していますか?どのように関係のための基本的なテストを設定するか、current_userの管理をテストする方法?

これについての基本的なテストは、そのようなことを整理することがモデルの仕事であるため、モデル仕様にあるべきです。

Iは、通常、このようにテスト:

1)備品を定義する(または交互FactoryGirlようなものを使用)は、2人のユーザーおよび一部の資産(この例では3つ)のために。ユーザaのための資産は、ユーザBのasset_b_用*、それら*)

2 asset_a_命名されている)のテストは、単純にこのようなものです:

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)) ユーザー(:users_a).assets.find(assets(:asset_a_a).id).should_notは含まれません。

もしあなたが絶対に望むのであれば、コントローラの部品に同様のテストを使うことができます。

あなたのモデルで定義した関連付けを処理するのは、主にRailsのコア機能だからです。

個人的に私は何らかの理由でこの種のテストを行っています。多くの場合、そのような許可関連団体は、やがてもっと複雑になり、とにかく詳細なテストが必要になります。誰かが協会のパラメタを変更して何かを壊すかもしれません。

II - コントローラ内のcurrent_user部分について。

これはもちろん、まず認証をどのように処理するかによって異なります。 AuthLogic(または何でも)のようなプラグインを使用すると、rspecでログインをシミュレートできるいくつかのメソッドがあるかもしれません。 authlogicのためには、このような何かを行うことができます。

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

これはauthlogicと「ログイン」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. 
関連する問題