我有以下测试:
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
对我来说,这显然是一个错误。想知道它是否可以在更高版本中修复?