0

私は RSpec に不慣れで、常に問題を抱えているのは、どのレコードが範囲内/範囲外かを理解することです。例については、以下を参照してください。FactoryGirl を介して一連のレコードを作成しています。たとえば、ユーザーを作成し、before ブロックでそのユーザーでサインインします。これは常にうまくいくようです。しかし、以前に作成したレコードの子であるレコードを使用しようとすると、問題が発生するようです。たとえば、グループで。グループには、ユーザーと group_type が必要です。この種のレコードで何かをしようとすると、「Called id for nil」というエラーが発生します。「puts group.name」を試してみましたが、グループが作成されていることがわかりますが、何らかの理由で「visit group_path(group)」行を実行すると、レコードが存在しなくなります。私は私を知っています' ここにはかなり基本的なものが欠けています。これは私を夢中にさせているので、助けていただければ幸いです。

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

Group 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
4

1 に答える 1

0

ここでの問題は、あなたが使用しているという事実だと思いますlet!。それらの違いは、非強打バージョンが怠惰であることです。変数が必要な場合にのみ評価されます。
bang バージョンは、各例の前に呼び出されます。ここでの問題は、非遅延の例の順序です。それらが実行される順序を保証できるとは本当に思いません。あなたの場合、 let!(:group) が実行されてから let!(group_type) が実行され、この失敗が発生すると思います。

于 2013-09-04T21:35:36.180 に答える