2014-10-06 52 views
0

我對rspec方式還是比較新的。我讀過redirect_to上的許多帖子,但似乎無法通過此錯誤。我試圖在我的rspec測試中模擬表單變量/值的傳遞,但得到一個路由錯誤。我正在將測試轉換爲正在運行的應用程序的rspec測試。在Rspec中傳遞形式變量以更新方法

在我的employees_micros_controller.rb中,我有一個需要params [:employees_micro] [:id]的更新方法。我的問題是如何在我的rspec測試中模擬這個?

控制器:

def update 
    @em = nil 
    # check for id from form 
    if params[:employees_micro][:id] 
    @em = EmployeesMicro.find_by_id(params[:employees_micro][:id]) 
    end 
    .... 
end 

Rspec的測試:注:###錯誤行###

# update and redirect 
describe 'POST #update' do 
    it "updates employee_micro and redirect to employee_details" do 
    # @emp_micros set in before(each) above 
    @emp_micros.home_job = 123 
    # update method looks for params[:employees_micro][:id] 
    post :update, :employees_micro => { :id => @emp_micros } ### error line ### 
    expect(response).to redirect_to("employee_details_employee_path") 
    end 
end 

錯誤:

Failure/Error: post :update, :employees_micro => { :id => @emp_micros } 
ActionController::RoutingError: 
    No route matches {:employees_micro=>{:id=>"11960"}, :controller=>"employees_micros", :action=>"update"} 

是我>>職位:更新線語法正確?

我不明白路由錯誤。我只是試圖模擬從我的測試傳遞一個表單變量到更新方法。如果我在post/put行之後刪除所有內容,我仍然會得到相同的錯誤,所以它肯定在該行上。

我也試過在測試中使用「放」代替「發佈」。它給我帶來了同樣的錯誤。

感謝您的任何提示或建議。

回答

0

更新路由使用:ID參數去是在頂層,所以使用:

post :update, :id => @emp_micros, :employees_micro => { <other attributes to update> } 
+0

這樣做,給了我一個「未定義的方法'[]‘的零:NilClassa’控制器更新錯誤方法在params [:employees] [:id]。params [:employees] [:id]是什麼來自窗體,所以我需要匹配在我的rspec測試。該方法不尋找params [: id],但期望params [:employees] [:id]。 – 2014-10-06 19:19:35

+0

這就是問題的一部分,你應該用'params [:id]'查找記錄。 – infused 2014-10-06 19:25:36

+0

同意!!!我實際上重構了controller.method使用編輯視圖的url中的id。感謝您指向我的方向。這個舊的應用程序需要一個很多愛... – 2014-10-06 20:09:44