2012-04-27 15 views
0

私はRSpecを初めてお使いになりました。問題が継続しているのは、どのレコードが範囲外であるかを理解することです。以下の例を参照してください。私はFactoryGirlを介して一連のレコードを作成しています。たとえば、ユーザーを作成してから、前のブロックでそのユーザーとsign_inします。これは常にうまくいくようです。しかし、以前に作成されたレコードの子どもであるレコードを使用しようとすると、問題が発生するようです。たとえば、グループを使用します。グループにはuserとgroup_typeが必要です。私がこれらの種類のレコードで何かをしようとするたびに、 "呼び出されたIDが無かった"というエラーが発生しました。私は "puts group.name"を試してみましたが、グループが作成されているのがわかりましたが、何らかの理由で "visit group_path(group)"行がレコードをもはや実行しなくなりました。私はここでかなり基本的なものが欠けていることを知っています。これが私を夢中にさせてくれたので、助けてくれてありがとう。RSpecはリクエスト仕様の子レコードを参照しています

describe "activities page" do 
    let(:user) { FactoryGirl.create(:user) } 
    let!(:group_type) { FactoryGirl.create(:group_type) } 
    let!(:group) { FactoryGirl.create(:group, user: user, group_type: group_type) } 

before do  
    sign_in user 
    visit group_path(group) 
    click_button "Check In" 
end 

エラー:

1) Activity pages activities page 
Failure/Error: visit group_path(group) 
RuntimeError: 
    Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id 

追加するグループのshowメソッド:

def show 
    @group = Group.find(params[:id]) 
    @members = @group.members.paginate(page: params[:page]) 
    cookies[:group_id] = @group.id 

    # Set Pusher chat 
    @chat = Chat.find_by_group_id(@group.id) 
    @user = current_user 
    @messages = Message.find(:all, :conditions => ["chat_id = ?", @chat.id.to_s]) 
end 
+0

あなたのGroupsControllerの 'show'メソッドはどのように見えますか? –

+0

上記に追加されました。見ていただきありがとうございます。 – pejmanjohn

+0

'@ chat'はnilですか?あなたのテストでは、作成したグループに関連するチャットは作成されていないようです。 –

答えて

0

は、私がここでの問題は、あなたがlet!を使用しているという事実であると考えています。 それらの違いは、非バンバージョンが怠惰だということです。変数が必要なときにだけ評価されます。
各例の前にバンバージョンが呼び出されます。 ここでの問題は、非遅延の例の順序です。私は本当に彼らが実行する順序を保証できるとは思わない。あなたの場合、let!(:group)はlet!(group_type)が実行される前にrunnningしていると信じて、この失敗の原因となります。

関連する問題