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_params
都incomplete_params
不起作用:两者都会引发异常并导致测试失败。
我已经验证了POST到运行中的服务器时,相同的参数有效负载将起作用(在中development
,但如上所述对配置进行了调整)。
Nic*_*Gnd -1
引发的异常是正确的,因为没有发送格式错误的 json。有效负载格式良好,但缺少参数。
你必须尝试类似的东西:
'{ i am malformed json'
Run Code Online (Sandbox Code Playgroud)