我正在使用Rails 4.2.5
,我正在尝试在发出格式错误的请求时测试来自控制器的预期400响应。参数验证逻辑由strong_parameters
处理。
在我的控制器中我有:
def user_params
params.require(:user).permit(:foo, :bar, :baz)
end
我在POST请求中引用user_params
,Accept
和ContentType
标头设置为application/json
。
在development
中,没有user
参数的帖子会引发ActionController::ParameterMissing
例外。
如果我在environments/development.rb
文件中设置它:
Rails.application.configure do
config.consider_all_requests_local = false
end
Rails将像production
一样运行并返回一个简单的400响应,而不是调试页面。大。
我在控制器测试中遇到了同样的麻烦(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,但它没有帮助(甚至提问者也认为它没用)。
如评论中所述,以下是控制器规范中的参数:
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_params
和incomplete_params
都不起作用:两者都会引发异常并导致测试失败。
我已经验证了相同的参数有效负载在POST到正在运行的服务器时会起作用(在development
中,但配置如上所述进行了调整)。
答案 0 :(得分:1)
如果您想在所有环境中模拟生产并且在缺少任何必需参数时始终提高400,而不是更改每个配置文件,只需将控制器(或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
答案 1 :(得分:-1)
问题是您正在尝试使用控制器中的:user
密钥获取哈希值。由于此哈希不适用于不正确的测试,因此会引发异常。
尝试这样的事情:
post :action, user: malformed_params
我还没有对它进行过测试,但它应该可行。
快乐的编码。 :)
答案 2 :(得分:-1)
引发的异常是正确的,因为没有发送格式错误的json。 有效载荷格式良好,但缺少参数。
你必须尝试类似的东西:
'{ i am malformed json'