Rails,如何测试缺少参数的400个响应

tom*_*ave 6 ruby rspec ruby-on-rails strong-parameters

我正在使用Rails 4.2.5,并且正在尝试测试来自控制器的预期400响应,以防请求格式错误。参数验证逻辑由处理strong_parameters

上下文

在我的控制器中,我有:

def user_params
  params.require(:user).permit(:foo, :bar, :baz)
end
Run Code Online (Sandbox Code Playgroud)

user_params在POST请求中引用,Accept并且ContentType标头设置为application/json

在中development,不带user参数的POST 将引发ActionController::ParameterMissing异常。
如果我在environments/development.rb文件中设置了此设置:

Rails.application.configure do
  config.consider_all_requests_local = false
end
Run Code Online (Sandbox Code Playgroud)

Rails的行为类似于in production并返回简单的400响应,而不是调试页面。大。

问题

尽管(rspec-rails ~> 3.4),我在控制器测试中做同样的事情有麻烦。

具体来说,这将通过:

expect {
  post :action, malformed_params
}.to raise_error(ActionController::ParameterMissing)
Run Code Online (Sandbox Code Playgroud)

但这不是因为引发异常:

post :action, malformed_params
expect(response.status).to eql 400
Run Code Online (Sandbox Code Playgroud)

我已经尝试过将其consider_all_requests_local用于测试环境,但无济于事。

有什么办法吗?对此有一个旧的答案,但是它没有帮助(甚至询问者也认为它没有用)。

编辑:

如评论中所要求的,这是控制器规范中的参数:

let(:user_data) do
  { foo: "foo", bar: "bar", baz: "baz" }
end

let(:good_params) do
  {
    some_id: SecureRandom.uuid,
    user: user_data
  }
end

let(:malformed_params) do
  { some_id: SecureRandom.uuid }.merge(user_data)
end

let(:incomplete_params) do
  { some_id: SecureRandom.uuid }
end
Run Code Online (Sandbox Code Playgroud)

good_params幸福之路而工作。当我要测试400时,两者malformed_paramsincomplete_params不起作用:两者都会引发异常并导致测试失败。

我已经验证了POST到运行中的服务器时,相同的参数有效负载将起作用(在中development,但如上所述对配置进行了调整)。

Nic*_*Gnd -1

引发的异常是正确的,因为没有发送格式错误的 json。有效负载格式良好,但缺少参数。

你必须尝试类似的东西:

'{ i am malformed json'
Run Code Online (Sandbox Code Playgroud)