描画結果に文字列が含まれている?・いない? shared_example : 小林研 Rails Tips (21)

はじめに

Rails Tips の 21 回目です。昨日から 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 は教員サーバでクラスを表示するページです。昨日の「レスポンスコード確認」の続きは以下のようになっていました。「クラス一覧」や「4300」という文字列が描画結果に含まれていること、「クラスの追加」という文字列が描画結果に含まれていないことをテストしています。

    describe "GET #index" do
      subject { -> { get teacher_kurasus_path } }
      it_behaves_like "レスポンスコード確認", 200
      it_behaves_like "描画結果に文字列が含まれている?", %w[クラス一覧 4300]
      it_behaves_like "描画結果に文字列が含まれていない?", "クラスの追加"
    end

これら二つの shared_example は以下のようになります。subject.call した後の response.body をチェックしているだけです。

shared_examples_for "描画結果に文字列が含まれている?" do |strs|
  it "レスポンスの文字列が「#{strs}」を含むこと" do
    subject.call
    Array(strs).each { |str| expect(response.body).to include str }
  end
end

shared_examples_for "描画結果に文字列が含まれていない?" do |strs|
  it "レスポンスの文字列が「#{strs}」を含まないこと" do
    subject.call
    Array(strs).each { |str| expect(response.body).not_to include str }
  end
end

正しく動作させるための実装

これは描画結果の確認だけなので、テンプレートに該当の文字列が表示されればいいだけです。

おわりに

index や show は描画の確認だけなので、テストは簡単でした。次は show を使って、not owned object の場合を説明します。