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

6pp0gazn  于 2023-08-04  发布在  Ruby
关注(0)|答案(3)|浏览(110)

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

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发送请求,我可以看到integer没有被转换为string。

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


谢谢你的帮助!

bjp0bcyl

bjp0bcyl1#

JSON有效载荷可以包含five value typesstringnumberintegerbooleannull
相比之下,HTTP查询字符串是 *only字符串
默认情况下,请求规范使用HTTP规范中指定的编码-即 * 所有参数都是字符串 *。这就是为什么你会看到参数被转换。
如果您的生产系统正在发送JSON,您需要告诉测试也这样做-例如。通过像上面那样添加as: :json

soat7uwm

soat7uwm2#

只需将as: :json添加到您的请求

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

字符串

tsm1rwdh

tsm1rwdh3#

经过多次尝试,我找到了解决这个问题的方法。如果传递用to_json转换的params,并将'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

字符串
这将按预期工作。

相关问题