RSpec在请求规范中引用子记录

时间:2012-04-27 01:08:07

标签: ruby-on-rails testing rspec rspec-rails

我是RSpec的新手,我一直遇到麻烦的是了解哪些记录在范围内/外。请参阅下面的示例。我正在通过FactoryGirl创建一系列记录。例如,我创建了一个用户,然后在前面的块中我与该用户签名。这似乎总是很好。但每当我开始尝试使用以前创建的记录的子记录时,我似乎遇到了麻烦。例如与组。组需要用户和group_type。每当我尝试用这些记录做某事时,我都会遇到“被叫id为nil”的错误。我已经尝试过“put 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

添加群组节目方法:

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

1 个答案:

答案 0 :(得分:0)

我认为这里的问题是您使用let!的事实。 它们之间的区别在于非爆炸版本是懒惰的。只有在需要变量时才会对其进行评估 在每个例子之前调用爆炸版本。 这里的问题是非懒惰的例子的顺序。我真的不认为你可以保证他们运行的订单。在你的情况下,我相信让!(:group)在let!(group_type)运行之前运行导致这个失败。