2012-04-27 54 views
0

我是RSpec的新手,我不斷遇到問題,那就是了解記錄是在哪個範圍內/哪一個範圍內。見下面的例子。我通過FactoryGirl創建了一系列記錄。例如,我創建了一個用戶,然後在前面的塊中用該用戶登錄。這似乎總是工作正常。但是,無論何時我開始嘗試使用之前創建的記錄的子記錄,我似乎都會陷入困境。例如與組。組需要一個用戶和一個group_type。每當我嘗試用這些記錄做某件事時,我都會遇到「被調用的ID爲零」錯誤。我試過「puts group.name」,我可以看到該組正在創建,但由於某些原因,「訪問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 

添加組顯示方法:

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方法是什麼樣的? – 2012-04-27 05:57:40

+0

已在上面添加。謝謝參觀。 – pejmanjohn 2012-04-27 17:05:30

+0

是@ @ chat'零?您的測試似乎沒有創建與其創建的組相關的任何聊天。 – 2012-04-27 17:43:23

回答

0

我相信這裏的問題是您正在使用let!的事實。 它們之間的區別在於非爆炸版本是懶惰的。只有在需要變量時纔對其進行評估。
bang版本在每個示例之前被調用。 這裏的問題是非懶惰示例的順序。我真的不認爲你可以保證他們運行的順序。在你的情況下,我相信讓!(:group)在let!(group_type)運行之前運行導致此失敗。