首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >继续获取Rspec中未定义的方法错误

继续获取Rspec中未定义的方法错误
EN

Stack Overflow用户
提问于 2015-09-17 12:59:46
回答 2查看 68关注 0票数 0

我有一个控制器动作‘秀’,我正在试着测试。控制器如下所示:

代码语言:javascript
复制
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 

表演动作的规格如下:

代码语言:javascript
复制
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不断抛出错误“un定义方法`squad_id‘for nil:NilClass",我认为它引用了显示操作中的第二行,即:

代码语言:javascript
复制
@opponent_squad = Squad.find(@opponents[0].squad_id)

知道为什么会发生这种情况,以及如何解决吗?(注:我对Rspec非常陌生)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-17 13:06:07

我想你的问题是这条线

代码语言:javascript
复制
 @opponents = @contest.entries.where.not(user_id: current_user.id).sort_by { |entry| -entry.total_points}

您正在查找user_id不是当前用户的所有条目。但在您的规范中,您创建的条目

代码语言:javascript
复制
  let!(:my_entry) { create(:entry, user_id: user.id, contest_id: contest.id) }

将user_id设置为当前用户,这样@ any集合就不会得到任何结果。

然后你寻找“对手”有一个价值。

代码语言:javascript
复制
 @opponent_squad = Squad.find(@opponents[0].squad_id)

得到一个例外。

我建议两件事。首先,更新规范以确保使用不同的user_id创建了该条目类的实例,这样@反对派就可以获得结果,然后将控制器中的最后两行包装为检查@opponents.any?这样,如果没有对手,你就不会把东西弄坏。

票数 1
EN

Stack Overflow用户

发布于 2015-09-17 13:09:47

在最后第三行中,您使用的是current_user.id:

代码语言:javascript
复制
 @opponents = @contest.entries.where.not(user_id: current_user.id).sort_by { |entry| -entry.total_points}

但是在您的规范中,您用curre_user定义了条目

代码语言:javascript
复制
let!(:my_entry) { create(:entry, user_id: user.id, contest_id: contest.id) } 

在这里,您将搜索所有没有current_user.id的条目:

代码语言:javascript
复制
@opponents = @contest.entries.where.not(user_id: current_user.id).sort_by { |entry| -entry.total_points}

对于您的规范,您应该创建其他用户,并为他创建一个条目。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32630934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档