rspecからpostリクエストしたときにjsonの数値が文字列になってしまう
はじめに
rails5で開発してますが、rspecでpostリクエストのテストを書いていたときにrails側で受け取ったparamsの内容がすべて文字列になってしまうという問題に突き当たりました
再現手順
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"] }