0

我在 rspec 中测试此代码时遇到问题-根据测试给我的错误,我知道测试是正确编写的(或多或少)-因为它期望的数据是正确的,只是由于某种原因没有得到它。我还应该注意代码在浏览器中工作。

编辑: 如果不清楚,请道歉。在这个控制器 ( evaluations_controller) 中,用户遍历给定组中的每个学生,并根据一组目标评估他们的进度。在新操作中,@student = groups.student.first-当该学生的评估数据已成功保存在创建操作中时,student_id 增加 1,并且新的 student_id 再次传递给新操作(因此可以评估下一个学生)-此循环直到没有学生为止。

我要测试的是,在创建操作中保存评估后,student_id 是否成功递增。

代码:

def create
...
  if @evaluation.save
    @id = params[:student_id]
    @id = @id.to_i + 1
    redirect_to evaluate_path({ student_group_id: @student_group, student_id: @id})   
  else  
    ... 
  end
end

Rspec 测试:

it "should load the next student" do
  #set @id to current student.id +1
  @id = @student.id
  @id = @id.to_i + 1
  #post :create
  post :create, {student_group_id: @student_group, student_id: @student, evaluation: @attr}
  controller.params[:student_id].should eql @id                
end

错误:

Failure/Error: controller.params[:student_id].should eql @id expected: 2 got: "1"

4

1 回答 1

1

您的代码似乎有缺陷,因此您的测试不清楚。

通过收集代码,我了解到您想使用某种类型的下一个/上一个学生功能。看来您正在破解您的控制器测试以实现这一目标。

if @evaluation.save
    @id = params[:student_id]
    @id = @id.to_i + 1

您正在手动计算下一个 id。问问自己这个问题:如果您正在使用student.id 1并运行此计算,但student.id 2已被删除,会发生什么?

您收到 ActiveRecord 错误。

你需要一个更好的方法来吸引下一个学生。您应该在 Student 模型中添加一个实例方法来为您处理:

  def next
    Student.where(id: id).order("id ASC").first
  end

在您的控制器中,您可以像这样移动到下一个学生:

redirect_to evaluate_path({ student_group_id: @student_group, student_id: @student.next.id})

那么你的测试应该会简单得多。

于 2013-08-19T14:25:20.730 回答