2015-09-17 84 views
0

我有一個控制器操作'show',我試圖測試。控制器看起來是這樣的:繼續在Rspec中獲取未定義的方法錯誤

def show 
    @contest = Contest.find(params[:contest_id]) 
    @my_entry = current_user.entries.where(contest_id: params[:contest_id]).sort_by { |entry| -entry.total_points} 
    @points_per_player = @my_entry[0].points_per_player 
    @total_points = @my_entry[0].total_points 
    @opponents = @contest.entries.where.not(user_id: current_user.id).sort_by { |entry| -entry.total_points} 
    @opponent_squad = Squad.find(@opponents[0].squad_id) 
    @opponent_points = @opponents[0].points_per_player 
end 

和show動作規範是這樣的:

describe 'GET /show' do 
    let!(:user) { create(:user) } 
    let!(:squad_1) { create(:squad) } 
    let!(:squad_2) { create(:squad) } 
    let!(:contest) { create(:contest) } 
    let!(:my_entry) { create(:entry, user_id: user.id, contest_id: contest.id) } 
    let!(:opponents) { [:squad_1, :squad_2] } 
    let!(:opponent_squad) { create(:squad) } 

before :each do 
    sign_in user 
    controller.instance_variable_set(:@opponent_squad, :squad) 
    get :show, contest_id: contest.id 
end 

it "renders the show template" do 
    (expect (response.status)).to eql(200) 
    (expect (assigns(:opponents))).to eql([:squad_1, :squad_2]) 
    (expect (assigns(:opponent_squad))).to eql(:squad) 
end 
end 

Rspec的不斷拋出的錯誤「未定義的方法`squad_id」的零:NilClass」,這是我認爲是指在表演動作倒數第二行,即:

@opponent_squad = Squad.find(@opponents[0].squad_id) 

任何想法,爲什麼發生這種情況,如何解決? (注意:我非常新Rspec的)

回答

1

我覺得你的問題是此行

@opponents = @contest.entries.where.not(user_id: current_user.id).sort_by { |entry| -entry.total_points} 

您正在尋找在user_id是不是當前用戶的所有條目。但是,在你的規範創建該條目

let!(:my_entry) { create(:entry, user_id: user.id, contest_id: contest.id) } 

設置USER_ID當前用戶,這樣@opponents收集不會與任何結果告終。

然後找@opponents有一個值

@opponent_squad = Squad.find(@opponents[0].squad_id) 

,並得到一個例外。

我建議兩件事。首先更新規範,確保已使用不同的user_id創建該Entry類的實例,以便@opponents獲得結果,然後用@ opponents.any檢查控制器中的最後兩行,所以如果沒有對手,你不會最終打破事情。

+0

非常感謝!有效! – NdaJunior

0

在過去的三線使用的是current_user.id:

@opponents = @contest.entries.where.not(user_id: current_user.id).sort_by { |entry| -entry.total_points} 

但在你規範定義與curre_user

let!(:my_entry) { create(:entry, user_id: user.id, contest_id: contest.id) } 

在這裏,您正在搜索的所有條目,而不current_user.id條目:

@opponents = @contest.entries.where.not(user_id: current_user.id).sort_by { |entry| -entry.total_points} 

對於您的規範,您應該創建其他用戶併爲他創建一個e n嘗試。

相關問題