Techioz Blog

Rails 5.2.3は、rspecを使用してテストするときにすべてのparamsデータ型を文字列に変換します

概要

私はRails 5.2.3を使用し、このようにRailsにリクエストを送信するときに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

助けてくれてありがとう!

解決策

JSON ペイロードには、文字列、数値、整数、ブール値、null の 5 つの値タイプを含めることができます。

対照的に、HTTP クエリ文字列は単なる文字列です。

デフォルトでは、リクエスト仕様は HTTP 仕様で指定されたエンコーディングを使用します。つまり、すべてのパラメータは文字列です。これが、パラメーターが変換される理由です。

運用システムが JSON を送信している場合は、テストにもそうするように指示する必要があります。上記と同様に as: :json を追加します。