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

时间:2019-05-16 05:45:32

标签: ruby-on-rails json ruby rspec ruby-on-rails-5

当我向这样的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

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

JSON有效负载可以包含five value typesstringnumberintegerbooleannull

相比之下,

HTTP查询字符串仅为字符串

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

如果您的生产系统正在发送JSON,则您还需要告知测试也要这样做-例如通过像上面一样添加as: :json