レスポンスコード確認 shared_example : 小林研 Rails Tips (20)

はじめに

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 に入りました。こちらも定型処理が多いので、先にテストをがっちり作ってしまって、それが通るように処理を書くだけになり、実装漏れをなくすことができます。