はじめに
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 の場合を説明します。