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

Ruby on rails 如何为控制器中的更新操作编写功能测试?,ruby-on-rails,Ruby On Rails,通过像:show和:edit这样的操作,我可以直接通过http获取它们。但是由于:update操作没有模板,因此我无法发布一个GET,因为它会抱怨缺少模板。这是有道理的,因此我尝试在测试中直接调用@controller.update,但在respond\u to块上出现错误: NoMethodError: undefined method `parameters' for nil:NilClass 如何将请求的格式指定为:html?我正在传递模型属性的参数散列FWIW。谢谢你的建议 编辑: 后

通过像
:show
:edit
这样的操作,我可以直接通过http获取它们。但是由于
:update
操作没有模板,因此我无法发布一个GET,因为它会抱怨缺少模板。这是有道理的,因此我尝试在测试中直接调用
@controller.update
,但在
respond\u to
块上出现错误:

NoMethodError: undefined method `parameters' for nil:NilClass
如何将请求的格式指定为
:html
?我正在传递模型属性的参数散列FWIW。谢谢你的建议

编辑: 后来我尝试在控制台中调用@controller.update(在设置参数[]之后),上面引用的错误从这里冒了出来:/actionpack-2.3.8/lib/action\u controller/mime\u responses.rb

我也尝试了PUT而不是GET,但仍然得到了“Missing Template update.erb”

此外,我还设法发现,这个缺少模板的错误是由以下代码块中标记的重定向或渲染以外的任何内容引起的:

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

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

我认为您的基本问题是,更新方法通常根本不是一个
get
请求。您应该
发布该操作

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

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

总的来说,这个问题可以更详细地说明您正在尝试做什么以及您当前的代码是什么样子。

谢谢您的想法。我尝试了PUT,但得到了“Missing template update.erb”。我编辑了原始帖子,以澄清我使用的是params,而不是“parameters”。我还找到了问题的更具体原因,但仍然不理解其根源。