2013-08-19 91 views
0

我在rspec中測試此代碼時遇到問題 - 基於測試給我的錯誤,我知道測試正確寫入(或多或少) - 因爲它期望的數據是正確的,它只是沒有得到它出於某種原因。我還應該注意到代碼在瀏覽器中工作。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"

+0

你永遠不會更新參數,看起來很清晰 – apneadiving

+0

在測試中,你的意思是?對不起,但我該怎麼做? – dax

+0

從你的斷言中你不清楚你想要測試什麼。你想斷言傳遞給'evaluate_path'的'student_id'比傳入create action的id大嗎? – gregates

回答

1

您的代碼似乎是有缺陷的,因此您的測試是不明確的。

從收集的代碼,我明白你想使用某種類型的下一個/以前的學生功能。看起來你正在圍繞你的控制器測試來實現這一目標。

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

您正在手動計算下一個ID。問問自己:如果您使用student.id 1,並且您運行此計算會發生什麼情況,但student.id 2已被刪除?

您收到ActiveRecord錯誤。

你需要一個更好的方式來拉下一個學生。你應該一個實例方法添加到您的學生模型來處理,對你:

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}) 

那麼你的測試應該是簡單得多。

+0

這是一個非常好的主意,謝謝 - 它確實使事情變得更容易。但目前來看,這不起作用。:/它剛剛返回'nil' '$ first_student.next' ==> '學生負荷(0.4ms)SELECT「students」。* FROM「students」WHERE「students」。「id」= 0 ORDER BY id ASC LIMIT 1' '=> nil' – dax

+0

事實上,我認爲我在方法def中導致了我的錯字,但是現在我修復了它並且我剛剛返回了相同的student_id(1) – dax

+0

瞭解了它 - http: //stackoverflow.com/a/7394804/2128691 雖然你仍然指出我在正確的方向,非常感謝! – dax