Ruby on rails Rails,如何在缺少参数的情况下测试400响应

Ruby on rails Rails,如何在缺少参数的情况下测试400响应,ruby-on-rails,ruby,rspec,strong-parameters,Ruby On Rails,Ruby,Rspec,Strong Parameters,我正在使用Rails4.2.5,并且我正在尝试测试一个预期的400响应,以防请求格式错误。参数验证逻辑由strong\u参数处理 上下文 在我的控制器中,我有: def user_params params.require(:user).permit(:foo, :bar, :baz) end 我在POST请求中引用了user_params,其中Accept和ContentType标题设置为application/json 在development中,没有user参数的发布将引发Actio

我正在使用Rails
4.2.5
,并且我正在尝试测试一个预期的400响应,以防请求格式错误。参数验证逻辑由
strong\u参数
处理

上下文 在我的控制器中,我有:

def user_params
  params.require(:user).permit(:foo, :bar, :baz)
end
我在POST请求中引用了
user_params
,其中
Accept
ContentType
标题设置为
application/json

development
中,没有
user
参数的发布将引发
ActionController::ParameterMissing
异常。
如果我在我的
环境/development.rb
文件中设置此选项:

Rails.application.configure do
  config.consider_all_requests_local = false
end
Rails将像在
生产中一样,返回一个简单的400响应,而不是调试页面。太好了

问题 但是,我在控制器测试中遇到了同样的问题(
rspecrails~>3.4

具体而言,这将通过:

expect {
  post :action, malformed_params
}.to raise_error(ActionController::ParameterMissing)
但这不会因为引发的异常而发生:

post :action, malformed_params
expect(response.status).to eql 400
我已经尝试为测试环境翻转
考虑\u所有\u请求\u本地
,但没有成功

有解决办法吗? 这一点上有很多问题,但没有帮助(甚至询问者也意识到这是没有用的)

编辑: 如评论中所述,以下是控制器规范中的参数:

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
good_params
适用于快乐之路。当我想测试400时,
格式错误的参数
不完整的参数
都不起作用:两者都会引发异常并导致测试失败


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

问题在于,您试图使用控制器中的
:user
键获取哈希值。由于此哈希不能用于不正确的测试,因此将引发异常

试着这样做:

post :action, user: malformed_params
我还没有测试过,但应该可以用


快乐编码:)

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

您必须在以下位置尝试类似的功能:

'{ i am malformed json'

如果您希望在所有环境中模拟生产,并在缺少任何必需参数时始终提高400,而不是更改每个配置文件,您可以将控制器(或
ApplicationController
或任何其他mixin设置为更通用):


畸形的帕尔马怎么样?你能分享一下吗?不,我想测试一下,如果一个参数丢失了,控制器是否会响应400。我不想测试成功的响应。我故意发送一个格式错误的请求。不,我没有尝试验证JSON语法结构。我试图检查响应是否缺少参数,并且响应应该是400,而不是异常。
# assuming we're talking about a JSON API

rescue_from ActionController::ParameterMissing do |e|
  render json: { error: e.message }, status: :bad_request
end

# or more general for any kind of response

rescue_from ActionController::ParameterMissing do |e|
  head :bad_request
end