测试返回param缺失或值为空

时间:2014-05-28 20:24:28

标签: ruby-on-rails ruby unit-testing

我正在研究RoR 4中的一个小应用程序,并且正在遇到打嗝。这是我正在使用的代码:

def update
  @status = current_user.statuses.find(params[:id])

  if params[:status] && params[:status].has_key?(:user_id)
    params[:status].delete(:user_id)
  end

  respond_to do |format|
    if @status.update(status_params)
      format.html { redirect_to @status, notice: 'Status was successfully updated.' }
      format.json { render :show, status: :ok, location: @status } #Original
    else
      format.html { render :edit }
      format.json { render json: @status.errors, status: :unprocessable_entity }
    end
  end
end

private
  # Never trust parameters from the scary internet, only allow the white list through.
  def status_params
    params.require(:status).permit(:user_id, :content)
  end
end

这是我正在进行的测试:

test "should not update status if nothing has changed" do
  sign_in users(:sean)
  patch :update, id: @status
  assert_redirected_to status_path(assigns(:status))
  assert_equal assigns(:status).user_id, users(:sean).id
end

当我运行测试时,这是我得到的失败:

1) Error:
   StatusesControllerTest#test_should_not_update_status_if_nothing_has_changed:
   ActionController::ParameterMissing: param is missing or the value is empty: status
   app/controllers/statuses_controller.rb:80:in `status_params'
   app/controllers/statuses_controller.rb:51:in `block in update'
   app/controllers/statuses_controller.rb:50:in `update'
   test/controllers/statuses_controller_test.rb:83:in `block in <class:StatusesControllerTest>'

当我发出puts语句时,输出显示:     {&#34;状态&#34; = GT; {&#34;内容&#34; = GT;&#34; MYTEXT&#34;}

所以我假设参数存在并填充。任何有关这方面的帮助将非常感激,因为我在我的智慧结束。这是我的github链接,代码托管在这里:

http://www.github.com/sean-perryman/treebook

1 个答案:

答案 0 :(得分:5)

问题在于您的测试用例patch :update, id: @status

试试这个:

patch :update, {id: @status.id, status: {user_id: @status.user_id, content: 'MyText'}}

您的控制器更新方法要求您传入的参数具有上述格式。 An:状态ID的id键和包含要更新的状态参数的散列的状态键。

你遇到的例外是你没有传递状态参数。

另一方面,最好放一个params.require(:id)而不是params[:id],因为你的方法取决于它。