gpt4 book ai didi

ruby-on-rails - Rails,如何测试缺少参数的 400 响应

转载 作者:数据小太阳 更新时间:2023-10-29 07:19:44 24 4
gpt4 key购买 nike

我正在使用 Rails 4.2.5,我正在尝试测试在请求格式错误的情况下来自 Controller 的预期 400 响应。参数验证逻辑由 strong_parameters 处理。

上下文

在我的 Controller 中我有:

def user_params
params.require(:user).permit(:foo, :bar, :baz)
end

我在 POST 请求中引用 user_paramsAcceptContentType header 设置为 application/json.

开发中,没有user参数的POST将引发ActionController::ParameterMissing异常。
如果我在我的 environments/development.rb 文件中设置它:

Rails.application.configure do
config.consider_all_requests_local = false
end

Rails 将像在 production 中一样运行并返回一个简单的 400 响应而不是调试页面。太好了。

问题

不过,我在 Controller 测试中遇到同样的问题 (rspec-rails ~> 3.4)。

具体来说,这将通过:

expect {
post :action, malformed_params
}.to raise_error(ActionController::ParameterMissing)

但这不会因为引发的异常:

post :action, malformed_params
expect(response.status).to eql 400

我已经尝试翻转测试环境的consider_all_requests_local,无济于事。

有什么解决办法吗?有 an old answer对此,但它没有帮助(甚至提问者也承认它没有用)。

编辑:

如评论中所问,以下是 Controller 规范中的参数:

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 时,malformed_pa​​ramsincomplete_params 都不起作用:两者都会引发异常并导致测试失败。

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

最佳答案

如果你想在所有环境中模拟生产,并且在缺少任何必需参数时总是引发 400,而不是更改每个配置文件,你可以只放入你的 Controller (或 ApplicationController 或任何其他mixin 使其更通用):

# 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

关于ruby-on-rails - Rails,如何测试缺少参数的 400 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34186682/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com