脚手架生成的RSpec Controller 规范中的一项测试失败,在我看来,它必须总是因设计而失败,但是当然可以肯定它会成功。

我使用rails g scaffold生成的RSpec规范开发了Rails 4应用程序。

我的SkillsController的 Controller 规范要求我为模型填写“有效属性”哈希值和“无效属性”哈希值。

除“使用无效参数的PUT更新重新渲染'edit'模板”之外,所有测试均成功完成:

 1) SkillsController PUT update with invalid params re-renders the 'edit' template
    Failure/Error: expect(response).to render_template("edit")
      expecting <"edit"> but rendering with <[]>
    # ./spec/controllers/skills_controller_spec.rb:139:in `block (4 levels) in <top (required)>'

在Rails控制台中,我确认我的invalid_params哈希包含无效参数({ hack: 'hack' })。

Controller 调用skill_params方法,该方法返回空哈希,因为我的invalid_params哈希仅包含无效参数。

用空的skill.update(skill_params)散列调用skill_params会返回true,因此else部分将永远不会执行,并且'new'模板将不会呈现:
  def update
    respond_to do |format|
      if @skill.update(skill_params) # empty hash due to invalid params!
        format.html { redirect_to @skill, notice: 'Skill was successfully updated.' }
        format.json { render :show, status: :ok, location: @skill }
      else
        format.html { render :edit }
        format.json { render json: @skill.errors, status: :unprocessable_entity }
      end
    end
  end

总结一下:规范向我的SkillController放置了带有无效参数的哈希。 SkillController的'skill_params'清除此哈希,并返回一个空哈希。哈希值为空的skill.update是no-op(在控制台上已确认),并且该方法返回true

因此,断言“edit”模板应该被渲染将永远不会为真,带有无效参数的update Action 的默认 Controller 规范也永远不会变成绿色。

我在这里想念什么?

最佳答案

我终于弄清楚了,并在此处发布了解决方案,以防其他人发现自己处于相同的情况。

“无效参数”哈希值不仅仅涉及具有无效属性名称的参数,而更多是关于无效属性值。

就像@Simone Carletti在响应中指出的那样,无效的属性名称将被简单地忽略/丢弃。

如果将无效值输入到 Controller ,则mymodel.update方法将返回false,并且 Controller 将重定向到:edit操作。

因此,为了使生成的规范通过,应在规范文件顶部的“无效属性”哈希中填充有效属性名称和无效属性值(例如,如果需要属性,则为nil)。

关于ruby-on-rails - RSpec Controller 规范在使用无效参数进行更新时失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34230016/

10-13 03:29