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 を追加します。