sinshutu_kibotuの日記

大体、大抵、大半、備忘録

rspecからpostリクエストしたときにjsonの数値が文字列になってしまう

はじめに

rails5で開発してますが、rspecでpostリクエストのテストを書いていたときにrails側で受け取ったparamsの内容がすべて文字列になってしまうという問題に突き当たりました

再現手順

以下のようなリクエストをrspecから送信すると

subject(:response) {
  post :update, params: {
    ids: [1, 2],
    names: ["hoge", "fuga"]
  }
}
it { 
  binding.pry
  expect(response.status).to eq(200) 
}

binding.pryの部分でparamsを表示してみると、idsが文字列になってしまう

> params
{
  ids: ["1", "2"],
  names: ["hoge", "fuga"]
}

2つの解決策

CONTENT_TYPEを指定する

rspecのデフォルトのCONTENT_TYPEはapplication/x-www-form-urlencoded なので、適切に文字列に変換してくれてます、jsonを送信する場合はapplication/jsonに書き換えるのが最良だと思います

subject(:response) {
  request.env["CONTENT_TYPE"] = 'application/json'
  post :update, params: {
    ids: [1, 2],
    names: ["hoge", "fuga"],
  }
}

paramsではなくbodyを使う

postするときに paramsではなくbodyに書き込みます、また asというパラメータに :jsonを指定してあげると request.body.read でリクエストしたパラメータを取得することができます

subject(:response) {
  post :update, body: {
    ids: [1, 2],
    names: ["hoge", "fuga"],
  }.to_json,
  as: :json
}
pry > request.body.read
=> {
  "ids":[1,2],
  "names": ["hoge", "fuga"]
}