Techioz Blog

呼び出し後のテスト時に 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’ とすると、期待どおりに動作しました。それが役に立てば幸い。