2014-10-06 23 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