はじめに
Rails Tips の 20 回目です。今日から request_spec に使う shared_example を紹介していきます。request_spec の index のテストまでの雛形は以下のようになっています。ここで使われているものを順に紹介してみます。
# rubocop:disable all require "rails_helper" RSpec.describe "<%= class_name.pluralize %>", type: :request do # let!(:<%= singular_table_name %>) { <%= plural_table_name %> :<%= singular_table_name %> } # let!(:object) { <%= singular_table_name %> } # let!(:attrs) { object.attributes } # let(:not_mine) { <%= plural_table_name %> :not_mine } # let(:return_path) { <%= plural_table_name %>_path } # context "login by hkob" do # kyouin_server_user_login :hkob # describe "GET #index" do # subject { -> { get <%= plural_table_name %>_path } } # context "owned object" do # let(:one) { <%= singular_table_name %> } # it_behaves_like "レスポンスコード確認", 200 # it_behaves_like "描画結果に文字列が含まれている?", %w[XXX一覧] # it_behaves_like "描画結果に文字列が含まれていない?", "XXXの追加" # end # context "not owned object" do # let(:one) { not_mine } # it_behaves_like "レスポンスコード確認", 302 # it_behaves_like "rootリダイレクト確認" # end # end
レスポンスコード確認
teacher_kurasus_path は教員サーバでクラスを表示するページです。上の雛形から作成されたものを以下のように修正します。subject は get を呼び出す Proc になります。「レスポンスコード確認」はそのリクエストのレスポンスコードが指定された数値であることを確認するものです。この場合、成功することを確認するため 200 であることを確認しています。
describe "GET #index" do subject { -> { get teacher_kurasus_path } } it_behaves_like "レスポンスコード確認", 200 (中略) end
この shared_example は以下のようになります。subject.call した後の response.status をチェックしているだけです。
shared_examples_for "レスポンスコード確認" do |value| it "レスポンスのステータスが #{value} であること" do subject.call expect(response.status).to eq value end end
正しく動作させるための実装
これはレスポンスコードの確認だけなので、メソッドとテンプレートを準備すれば普通に通るはずです。
おわりに
いよいよ request_spec に入りました。こちらも定型処理が多いので、先にテストをがっちり作ってしまって、それが通るように処理を書くだけになり、実装漏れをなくすことができます。