【问题标题】:Pass Form Vars in Rspec to Update Method将 Rspec 中的表单变量传递给更新方法
【发布时间】:2014-10-06 18:50:24
【问题描述】:

我对 rspec 方式还是很陌生。我在redirect_to 上阅读了许多帖子,但似乎无法通过此错误。我试图在我的 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 行之后的所有内容,我仍然会收到相同的错误,所以它肯定在该行。

我还尝试在测试中使用“put”代替“post”。它给我带来了同样的错误。

感谢任何提示或建议。

【问题讨论】:

    标签: ruby-on-rails rspec


    【解决方案1】:

    更新路由期望 :id 参数位于顶层,因此使用:

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

    【讨论】:

    • 这样做会给我一个“未定义的方法 `[]' for nil:NilClassa' 在 params[:employees][:id] 上的控制器更新方法中出现错误。params[:employees][: id] 是来自表单的内容,所以我需要在我的 rspec 测试中匹配它。该方法不是在寻找 params[:id],而是期待 params[:employees][:id]。
    • 这是问题的一部分。您应该使用params[:id] 查找记录。
    • 同意!!!我实际上重构了 controller.method 以使用编辑视图的 url 中的 id。感谢您向我指出那个方向。这个老应用需要很多的爱......
    猜你喜欢
    • 2017-04-20
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多