Rails,如何用缺少的参数测试400响应

时间:2015-12-09 18:48:42

标签: ruby-on-rails ruby rspec strong-parameters

我正在使用Rails 4.2.5,我正在尝试在发出格式错误的请求时测试来自控制器的预期400响应。参数验证逻辑由strong_parameters处理。

上下文

在我的控制器中我有:

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

我在POST请求中引用user_paramsAcceptContentType标头设置为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_paramsincomplete_params都不起作用:两者都会引发异常并导致测试失败。

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

3 个答案:

答案 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'