Ruby on Railsのコントローラに対するRSpecの書き方の紹介です。 このドキュメントはRails 5.1、Ruby 2.4.1を前提とします。
😼 コントローラの責務
コントローラには次の責務があります。ユニットテストでは責務に対するテストを行います。
リクエストに対して、適切なレスポンス(ステータスコードなど)を返す
ビューの表示に必要なモデルオブジェクトが読み込まれている
レスポンスを表示するのに適切なビューを選択する
🗽 環境準備
assignsを使いたいので、Gemfileに以下を入れてbundle installを実行。
gem 'rails-controller-testing'
rails_helperに次の設定を追加。
RSpec.configure do|config| [:controller, :view, :request].each do|type| config.include::Rails::Controller::Testing::TestProcess, type: type config.include::Rails::Controller::Testing::TemplateAssertions, type: type config.include::Rails::Controller::Testing::Integration, type: type end end
it 'saves new article'do expect do post :create, params: { article: article_attributes }, session: {} end.to change(Article, :count).by(1) end
it 'redirects the :create template'do post :create, params: { article: article_attributes }, session: {} article = Article.last expect(response).to redirect_to(article_path(article)) end end
🐡 updateアクションのRSpec
describe 'PATCH #update'do let!(:article) { create(:article) } let(:update_attributes) do { title:'update title', body:'update body' } end
it 'saves updated article'do expect do patch :update, params: { id: article.id, article: update_attributes }, session: {} end.to change(Article, :count).by(0) end