Rails 5控制器测试-请求之间的请求参数未更新

时间:2019-07-12 11:32:01

标签: ruby-on-rails ruby-on-rails-5 minitest

我有以下测试:

  test 'should create two different parents' do
    post :create, params: { parent: { name: 'Parent A' }}, as: :json
    post :create, params: { parent: { name: 'Parent B' }}, as: :json

    assert_not_nil Parent.find_by_name 'Parent A'
    assert_equal 1, Parent.where(name: 'Parent A').count
    assert_not_nil Parent.find_by_name 'Parent B'
  end

此测试在计数声明上失败。

Failure:
ParentsControllerTest#test_should_create_two_different_parents [/Users/makasprzak/projects/nested_attrs/rails_troubles/test/controllers/parents_controller_test.rb:18]:
Expected: 1
Actual: 2

我发现这是因为当我在该测试中第二次发出发布请求时,被测试的控制器仍然从第一个请求中获取参数。我还发现,我可以通过删除as: :json属性来解决此问题。

这是一个已知问题,对此有任何解决方法吗?我确切的rails版本是5.0.7.2。可以找到here。重现该问题的示例代码。

更新1:

要求的控制器代码:

class ParentsController < ApplicationController
  before_action :set_parent, only: [:show, :update, :destroy]

  wrap_parameters include: [
      :name,
      :children_attributes
  ]

  # GET /parents
  def index
    @parents = Parent.all

    render json: @parents
  end

  # GET /parents/1
  def show
    render json: @parent
  end

  # POST /parents
  def create
    @parent = Parent.new(parent_params)

    if @parent.save
      render json: @parent, status: :created, location: @parent
    else
      render json: @parent.errors, status: :unprocessable_entity
    end
  end

  # PATCH/PUT /parents/1
  def update
    if @parent.update(parent_params)
      render json: @parent
    else
      render json: @parent.errors, status: :unprocessable_entity
    end
  end

  # DELETE /parents/1
  def destroy
    @parent.destroy
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_parent
      @parent = Parent.find(params[:id])
    end

    # Only allow a trusted parameter "white list" through.
    def parent_params
      params.require(:parent).permit(:name, children_attributes: [:id, :name, :_destroy])
    end
end

更新2: 我找到了一种替代方法,可以像这样在我的ApplicationController中覆盖recycle!方法:

class ApplicationController < ActionController::API
  def recycle!
    request.delete_header('RAW_POST_DATA')
    super
  end
end

对我来说,这显然是一个错误。想知道它是否可以在更高版本中修复?

0 个答案:

没有答案