脚手架生成的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).