我正在使用Rails 4.2.5
,并且正在尝试测试来自控制器的预期400响应,以防请求格式错误。参数验证逻辑由处理strong_parameters
。
在我的控制器中,我有:
def user_params params.require(:user).permit(:foo, :bar, :baz) end
我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
Rails的行为类似于in 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
用于测试环境,但无济于事。
有什么办法吗?对此有一个旧的答案,但是它没有帮助(甚至询问者也认为它没有用)。
如评论中所要求的,这是控制器规范中的参数:
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
,但如上所述对配置进行了调整)。