如何将Ruby on Rails RSpec控制器规范中因使用无效参数更新而失败的错误改写成长尾?
- 内容介绍
- 文章标签
- 相关推荐
本文共计635个文字,预计阅读时间需要3分钟。
在生成RSpec控制器的规范中,一个测试失败表明问题可能出在设计层面。尽管如此,它也可能只是实现细节上的问题。我开发了一个Rails 4应用,其中包含由`rails g scaffold`生成的RSpec规范。测试失败的原因可能是设计缺陷,但很可能只需调整实现即可成功。
我开发了一个Rails 4应用程序,其中包含由rails g scaffold生成的RSpec规范.
我的SkillsController的控制器规范要求我为我的模型填写“有效属性”哈希和“无效属性”哈希,我做了.
测试全部成功,除了“PUT更新,无效参数重新渲染’编辑’模板”:
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’}).
控制器调用skill_params方法,该方法返回空哈希,因为我的invalid_params哈希只包含无效参数.
使用空的skill_params哈希调用skill.update(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
总结一下:规范将带有无效参数的哈希PUT输出到我的SkillController. SkillController的’skill_params’清除此哈希值,返回空哈希值.具有空哈希的skill.update是无操作(在控制台上确认),并且该方法返回true.
因此,应该呈现“编辑”模板的断言永远不会成立,并且具有无效参数的更新操作的默认控制器规范将永远不会变为绿色.
我在这里错过了什么?
我终于想出来并在这里发布解决方案,以防其他人发现自己处于相同的情况.‘invalid params’哈希不是关于具有无效属性名称的参数,而是关于无效属性值的更多信息.
简单地忽略/丢弃无效的属性名称,就像@Simone Carletti在他的回答中指出的那样.
如果无效值是PUT到控制器,mymodel.update方法将返回false,并且控制器重定向到:edit操作.
因此,为了使生成的规范通过,spec文件顶部的“无效属性”散列应填充有效的属性名称和无效的属性值(例如,如果需要属性,则为nil).
本文共计635个文字,预计阅读时间需要3分钟。
在生成RSpec控制器的规范中,一个测试失败表明问题可能出在设计层面。尽管如此,它也可能只是实现细节上的问题。我开发了一个Rails 4应用,其中包含由`rails g scaffold`生成的RSpec规范。测试失败的原因可能是设计缺陷,但很可能只需调整实现即可成功。
我开发了一个Rails 4应用程序,其中包含由rails g scaffold生成的RSpec规范.
我的SkillsController的控制器规范要求我为我的模型填写“有效属性”哈希和“无效属性”哈希,我做了.
测试全部成功,除了“PUT更新,无效参数重新渲染’编辑’模板”:
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’}).
控制器调用skill_params方法,该方法返回空哈希,因为我的invalid_params哈希只包含无效参数.
使用空的skill_params哈希调用skill.update(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
总结一下:规范将带有无效参数的哈希PUT输出到我的SkillController. SkillController的’skill_params’清除此哈希值,返回空哈希值.具有空哈希的skill.update是无操作(在控制台上确认),并且该方法返回true.
因此,应该呈现“编辑”模板的断言永远不会成立,并且具有无效参数的更新操作的默认控制器规范将永远不会变为绿色.
我在这里错过了什么?
我终于想出来并在这里发布解决方案,以防其他人发现自己处于相同的情况.‘invalid params’哈希不是关于具有无效属性名称的参数,而是关于无效属性值的更多信息.
简单地忽略/丢弃无效的属性名称,就像@Simone Carletti在他的回答中指出的那样.
如果无效值是PUT到控制器,mymodel.update方法将返回false,并且控制器重定向到:edit操作.
因此,为了使生成的规范通过,spec文件顶部的“无效属性”散列应填充有效的属性名称和无效的属性值(例如,如果需要属性,则为nil).

