Rails 5.2.3 在使用 rspec 测试时将所有参数数据类型转换为字符串

问题描述 投票:0回答:4

当我像这样向rails发送请求时,我正在使用rails 5.2.3并使用rspec-rails(3.8.2)进行测试

  let(:params) do
    {
      down_payment: 10_000,
      asking_price: 100_000,
      payment_schedule: 'weekly',
      amortization_period: 5
    }
  end
  it 'works' do
    get :calculate, params: params, format: :json
    expect(response.status).to eq 200
  end

我也尝试过

  it 'works' do
    get :calculate, params: params, as: :json
    expect(response.status).to eq 200
  end

在 Rails 中,所有整数都会像这样转换为字符串

<ActionController::Parameters {"amortization_period"=>"5", "asking_price"=>"100000", "down_payment"=>"10000", "payment_schedule"=>"weekly", "format"=>"json", "controller"=>"payment_amount", "action"=>"calculate", "payment_amount"=>{}} permitted: false>

但是如果我使用curl发送请求,我可以看到整数没有转换为字符串。

curl -X GET -H "Content-Type: application/json"  -d ‘{"asking_price": 100000 ,"payment_schedule": "monthly", "down_payment": 10000, "amortization_period": 5  }' http://localhost:3000/payment-amount

感谢您的帮助!

ruby-on-rails json ruby rspec ruby-on-rails-5
4个回答
4
投票

JSON 负载可以包含五种值类型

string
number
integer
boolean
null

相比之下,HTTP 查询字符串只是字符串

默认情况下,请求规范使用 HTTP 规范中指定的编码 - 即 所有参数都是字符串。这就是您看到参数被转换的原因。

如果您的生产系统正在发送

JSON
,您也需要告诉测试也这样做 - 例如像上面那样添加
as: :json


1
投票

只需在您的请求中添加

as: :json
格式

post(graphql_path, params: params, as: :json)

1
投票

经过多次尝试,我找到了解决这个问题的方法。如果您传递用

params
转换的
to_json
并将
'CONTENT_TYPE' => 'application/json'
作为 env 传递,
integers
将被传递到控制器。

let(:params) do
  {
    down_payment: 10_000,
    asking_price: 100_000,
    payment_schedule: 'weekly',
    amortization_period: 5
  }
end

it 'works' do
  post '/', params.to_json, 'CONTENT_TYPE' => 'application/json'
end

这将按预期工作。


0
投票

注意,它不是format: :json

而是
as: :json
。我忽略了这一点。

© www.soinside.com 2019 - 2024. All rights reserved.