ActionController::TestCaseの仕様なのでRspecに限らないが、例えばRspecを使用した場合。
it 'POSTでリソースが作成できる' do
params = { paris: [[1, 2], [3, 4]] }
post '/resources', params
expect(response).to have_http_status :created
end
ブラウザからは問題なくリソースの作成が行えるがテストはコケる。
原因を調べるためにコントローラー側でbinding.pry
すると
以下のようにparamsが展開されてしまっていることが分かった。
params[:paris] # => ["1", "2", "3", "4"]
解決するにはpost
にas: :json
オプションを渡してあげればいい。
it 'POSTでリソースが作成できる' do
params = { paris: [[1, 2], [3, 4]] }
post '/resources', params, as: :json
expect(response).to have_http_status :created
end
参考:
Allow setting of request CONTENT-TYPE with as: in controller tests
問題が起きた原因はテスト時のデフォルトのContent-Typeがapplication/x-www-form-urlencoded
であること。
ネストされていない配列だったら問題ないがネストされた配列だと、パラメーターのparse時に構造が失われてしまう。
JSON形式で送ればパラメータの構造は維持されるので問題は起きない。