Ruby on rails Rails,如何在缺少参数的情况下测试400响应
我正在使用RailsRuby 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
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