はじめに
一部React化で久しぶりにAPIを作成しました
JSONを受け渡しするRails APIのrequest specの書き方まとめです
headersにContent-Typeを追加する
headersに'Content-Type' => 'application/json'
を追加する
これでJSONのparamsを渡すことができるようになります
追加しないとデフォルトでは
"CONTENT_TYPE"=>"multipart/form-data"
となり
数値やbooleanが文字列に変換されてしまいます
describe 'PATCH #update' do
subject { patch xxx_path(article), headers: { "Content-Type" => "application/json" } }
...
end
JSONのparamsを用意する
let!(:params) { { name: 'タイトル', body: '本文' }.to_json }
to_json
を使ってHashからJSONにパースするのがポイント
パースしないと
ActionDispatch::Http::Parameters::ParseError
を吐いて500が帰ってきます
requestにparamsを渡す
describe 'PATCH #update' do
subject { patch xxx_path, params: params, headers: { "Content-Type" => "application/json" } }
...
end
テストする
as_json
はハッシュのキーをシンボルから文字列に変換してくれます
最初から文字列のハッシュを書いてもOKですが、キーがシンボルの方がスッキリするので今回はシンボルで定義してからas_json
しています
it 'creates article and returns correct response' do
expect { subject }.to change(Article, :count).by(1)
expect(Article.last.name).to eq 'タイトル'
expect(Article.last.name).to eq '本文'
expect(response).to have_http_status 200
expect(JSON.parse(response.body)).to include({
article: { id: 1, name: 'タイトル', body: '本文' }
}.as_json)
end
まとめ
超簡単にですがRails APIのrequest specの書き方をまとめました
あとは params
や it
の中身を変えるだけで応用できるかなと思います
間違いなどあればコメントで指摘していただけますと幸いです!
参考記事