在不允许 ID 的情况下测试 PUT 的控制器规格

Testing controller specs for PUT without permitting ID

我有一个 RESTfully 更新模型的控制器。操作如下所示:

def update
  @user = User.find(params[:id])
  params['skill_list'] = params['skill_list'].join(',') if params['skill_list'].present?
  @user.update!(user_params)
  render nothing: true
end

def user_params
  params.permit(:id, :summary, :skill_list)
end

我的规格如下:

it "should return 200 if param is for user put is summary" do
  ActionController::Parameters.action_on_unpermitted_parameters = :raise
  put :update, id: @bob.id, summary: 'yadayada', skill_list: ['a','b']
  assert_response 200
end

现在流程如下

  1. 我们需要将 id 放在 put 规范中,以便告诉它在更新时使用哪个 id
  2. 控制器找到它并更新 summaryskill_list 字段。
  3. 但是,它也会覆盖 id
  4. 如果我不允许 id,测试失败 ActionController::UnpermittedParams
  5. 如果我允许,实际的 id 会被替换(我们使用 friendly_id gem 所以这是不需要的 - 数字 ID 将被 slug 替换,呈现用户无法使用。

目前我们禁止 id 并将规范置于待定状态 - 但在这些情况下最佳实践是什么?

提前致谢!

Patient: it hurts when I update my ID column!

Doctor: well then stop doing that.

从允许的参数列表中删除 "id"。它不属于那里。

更新模型:

@user.update!(user_params)

更新 ID 列,因为 user_params 包含一个 id 键。停止这样做:

@user.update!(user_params.except("id"))