如何为控制器中的更新操作编写功能测试?

时间:2010-07-29 19:14:28

标签: ruby-on-rails

使用:show:edit等操作,我只能http来获取它们。但由于:update操作没有模板,因此我不能在没有抱怨丢失模板的情况下发出GET。这是有道理的,所以我尝试在我的测试中直接调用@controller.update,但我在respond_to块上收到错误:

NoMethodError: undefined method `parameters' for nil:NilClass

如何将请求的格式指定为:html?我传入了模型属性FWIW的参数哈希。谢谢你的任何建议。

编辑: 我尝试在控制台中调用@ controller.update(在设置params []之后)并且上面引用的错误从这里冒出来:/ actionpack-2.3.8/lib/action_controller/mime_responds.rb

我也尝试过PUT而不是GET,但仍然有“Missing Template update.erb”。

此外,我设法发现丢失模板的这个错误是由于在此处标记的代码块中除了重定向或渲染之外的任何内容引起的:

respond_to do |format|
  if @model.update_attributes(params[:model])
     flash[:notice] = 'note!'
     format.html { **HERE** }
     ...

我有一个方法调用,只是一个条件重定向到正确的位置。原则上,我可以理解为什么它可能会寻找要呈现的模板,因为它可能不知道下游有重定向,但我不明白的是我的Web应用程序如何不会遇到同样的问题。错误作为我的功能测试。

2 个答案:

答案 0 :(得分:0)

我认为您的基本问题是更新方法通常不是get请求。你应post采取行动。

你得到的错误听起来像是在遇到更严重的问题。 Rails使用params,而不是parameters,所以这是一个非常奇怪的错误。我不知道这是否与直接在控制器上调用方法有关,因此没有Rails预期的其他上下文或者是否是一个额外的问题。如果切换到post无法解决问题,请使用测试正文更新您的问题。

答案 1 :(得分:0)

  • 您应该在测试中致电put :update。如果控制器中有@my_model.update_attributes(params[:my_model])之类的代码,那么您可以在测试中调用put :update, :id => <whatever>, :my_model => {:foo => 'bar'}
  • :html是默认格式,因此您无需指定它。如果你真的想,你可以做put :update, :format => :html。但同样,没有必要。
  • 正如Emily所说,它是params,而不是parameters,所以你可能正在访问错误的哈希

总的来说,这个问题可以使用一些更详细的信息来了解您正在尝试做什么以及您当前的代码是什么样的。