解決策
as: :json
オプションをつける。
post '/posts', params: post_params, as: :json
解説
rspecのデフォルトのCONTENT_TYPEはapplication/x-www-form-urlencoded なので、適切に文字列に変換してくれてます、jsonを送信する場合はapplication/jsonに書き換えるのが最良だと思います
https://sinshutu-kibotu.hatenablog.jp/entry/2018/07/06/202132
なるほど。
サンプルコード
RSpec.describe 'post add', type: :request do
describe 'POST /posts' do
context '投稿記事作成' do
let(:post_params) do
{
age: 2,
sex: 'female',
status: 0,
answer: {
text: '初の投稿です。',
score: 1
}
}
end
it 'create posts' do
expect do
post '/posts', params: post_params, as: :json
end.to change { Post.count }.by(1)
end
end
所感
ActiveModel::Attributesで型をcastする、というアプリケーション側での解決策も不可能ではない気がした(が、サンプルコードのようにパラメータがネストしていると大変だったため断念)。
- https://qiita.com/alpaca_taichou/items/bebace92f06af3f32898
- https://api.rubyonrails.org/classes/ActiveRecord/Attributes/ClassMethods.html