2012-07-09 187 views
1

這以下控制器測試失敗了,我想不通爲什麼:Rspec的測試失敗

describe "GET 'index'" do 

    before(:each) do 
     @outings = FactoryGirl.create_list(:outing, 30) 
     @user = FactoryGirl.create(:user) 
    end 

    it "should be successful" do 
     get :index 
     response.should be_success 
    end 

end 

Rspec的提供了(而無益的)錯誤:

Failure/Error: response.should be_success 
    expected success? to return true, got false 

這裏的代碼實際控制器也是如此:

def index 
    if @user 
     @outings = Outing.where(:user_id => @user.id) 
     @outing_invites = OutingGuest.where(:user_id => @user.id) 
    else 
     flash[:warning] = "You must log in to view your Outings!" 
     redirect_to root_path 
    end 
end 

任何人有一個想法是什麼原因導致我的測試失敗?我認爲它可能與外出控制器中的條件有關,但我不知道什麼是合格測試看起來像什麼......

+0

我想你是從控制器的實例變量與規範混淆。在您的控制器中,與@user關聯值的代碼在哪裏? – cfeduke 2012-07-09 23:41:40

回答

1

你混淆了兩個獨立類之間的實例變量 - 控制器是它的自己的類和規範是它自己的類。他們不分享國家。你可以試試這個簡單的例子來更好地瞭解...

def index 
    // obvious bad code, but used to prove a point 
    @user = User.first 
    if @user 
     @outings = Outing.where(:user_id => @user.id) 
     @outing_invites = OutingGuest.where(:user_id => @user.id) 
    else 
     flash[:warning] = "You must log in to view your Outings!" 
     redirect_to root_path 
    end 
end 

我想這FactoryGirl.create_list(:outing, 30)不會創建一個郊遊,因爲你所創建的用戶在創建後的郊遊的第一個用戶關聯郊遊,所以你的Outing.where也會失敗。

重要的是要明白,當您將數據庫包含在測試堆棧中時,數據庫需要以測試期望的方式包含數據。因此,如果您的控制器正在查詢屬於特定用戶的郊遊,則您的規範需要設置環境,以便控制器將檢索到的用戶(在本例中,我的示例中爲User.first的可怕行)也將與其關聯該規範正在期待。

+0

可靠的解釋!謝謝你的幫助。 – 2012-07-10 00:05:01

+0

我應該補充一點,FactoryGirl確實與數據庫交互,它不是一個神奇的獨角獸,當我第一次開始使用它時,花了我一段時間纔想到。如果你剛剛進入這一切,我會推薦撬(http://pryrepl.org/)它會阻止你撕掉你的頭髮。 (你的代碼中的'binding.pry'就像一個調試斷點!) – cfeduke 2012-07-10 00:07:30