RailsのRequest Spec


RailsのRSpecではRequestを受けた際の処理のテストを書くのに「Request Spec」を書くことが推奨されています。Controller Specと違い、ルータやミドルウェアスタック、Rackリクエストやレスポンスまで実行します。これによって、より現実に近い環境でテストを行うことができます。

🐹 テストで重要な観点

  • 受信したリクエストに対して適切なレスポンスを返す
  • Viewで使用するために必要なModelのオブジェクトを取得する
  • レスポンスを表示するのに適切なViewを選択する

👽 新規データの作成シナリオのテスト

新規のwidgetページを開いて、必要な情報をPOSTしてwidgetを新規作成して表示するまでのテストです。

require 'rails_helper'
RSpec.describe 'Widget management', type: :request do
it creates a Widget and redirects to the Widget's page do
get '/widgets/new'
expect(response).to render_template(:new)
post '/widgets', widget: { name: 'My Widget'}
expect(response).to redirect_to(assigns(:widget))
follow_redirect!
expect(response).to render_template(:show)
expect(response.body).to include('Widget was successfully created.')
end
end

🤔 JSONのレスポンスのテスト

APIにアクセスして、JSONのレスポンスを受け取るテストです。

require 'rails_helper'
RSpec.describe 'Widget management', type: :request do
it 'creates a Widget' do
headers = {
'ACCEPT' => 'application/json', # This is what Rails 4 accepts
'HTTP_ACCEPT' => 'application/json' # This is what Rails 3 accepts
}
post '/widgets', { widget: { name: 'My Widget'} }, headers
expect(response.content_type).to eq('application/json')
expect(response).to have_http_status(:created)
end
end

🐠 参考リンク

📚 おすすめの書籍