2015-09-17 54 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尝试。

相关问题