呼び出し後のテスト時に Rails/Rspec JSON 整数が文字列に変換される
概要
API への JSON リクエストをテストしています。JSON で応答します。 JSON 内のすべての整数は、アクションを考慮してコントローラーに送信されるときに文字列に変換されるようです。
def consider
binding.pry # binding no# 2 used to check the params after post from test.
if ParametersValidator.is_valid?(params)
application_handler = ApplicationHandler.new(request_interactor)
render json: application_handler.result
else
render json: ParametersValidator.failed_params(params).to_json
end
end
ParamaterValidator は、受信するデータの構造とタイプを検証します。
render_views
let(:json) { JSON.parse(response.body) }
..
..
it 'returns the result in the correct format for the AUTOMATIC APPROVE decision' do
automatic_approve_params = relative_json_file(relative_file('automatic_approve_params'))
expected_approve_params = {
"status" => "accepted",
"automated" => true,
"rate" => 6,
"amount" => 30000,
"term" => 10,
"pre_approved_amount" => 2500,
"comments" => ""
}
@request.headers['HTTP_X_AUTH_SIG'] = Rails.application.secrets['authorization']['token']
request.env["HTTP_ACCEPT"] = 'application/json'
binding.pry # binding no# 1 to inspect the params before post
post :consider, automatic_approve_params, format: :json
expect(json).to eq(expected_approve_params)
end
{
"student_id"=>1,
"age"=>22,
"name"=>"John",
"age_range"=>"22-25",
"criminal_record"=>false,
"declared_bankrupt"=>false,
"declared_insolvent"=>false,
"declared_sequestrated"=>false,
"defaulted_on_loan"=>false,
"post_study_salary"=>100000000,
"first_nationality"=>"PL",
"second_nationality"=>"",
"citizenship"=>"PL",
}
{
"student_id"=>"1",
"age"=>"22",
"name"=>"John",
"age_range"=>"22-25",
"criminal_record"=>false,
"declared_bankrupt"=>false,
"declared_insolvent"=>false,
"declared_sequestrated"=>false,
"defaulted_on_loan"=>false,
"post_study_salary"=>"100000000",
"first_nationality"=>"PL",
"second_nationality"=>"",
"citizenship"=>"PL",
}
テスト ログには、リクエストが次のとおりであることが示されています。
Processing by Api::V1::CreditApplicationsController#consider as JSON
ポストアクションの直前にリクエストを検査すると、パラメーターに問題がないことがわかります。次に、何かを実行する前にコントローラーでパラメーターを検査すると、それらはすべて文字列です。
postman を使用して JSON で API をテストすることは期待どおりに機能しますが、検討アクションに投稿するときの rspec はすべてのパラメータを文字列に変換するようです。投稿アクションに format: :json を追加するとこの問題が解決すると主張する投稿を数十件読みましたが、そのような幸運はありませんでした。
私は明らかに何か間違ったことをしていますが、知っていることはほぼすべて試しました。
解決策
あなたが抱えている問題を再現した後、以下を使用してコントローラー仕様で問題を解決することができました。
post :consider、automatic_approve_params.merge(形式: :json)
ローカルテストでは、 request.env[“HTTP_ACCEPT”] = ‘application/json’ とすると、期待どおりに動作しました。それが役に立てば幸い。