リダイレクト確認 shared_example : 小林研 Rails Tips (24)

はじめに

Rails Tips の 24 回目です。昨日から create の request_spec を紹介していきます。

  # describe "POST #create" do
  #   before { object.destroy }
  #   subject { -> { post <%= plural_table_name %>_path, params: {<%= singular_table_name %>: attrs} } }
  #   context "owned object" do
  #     let(:one) { <%= singular_table_name %> }
  #     context "正しいパラメータに対して" do
  #       it_behaves_like "レスポンスコード確認", 302
  #       it_behaves_like "オブジェクトが1増えるか?", <%= class_name %>
  #       it_behaves_like "リダイレクト確認"
  #       it_behaves_like "Notice メッセージ確認", "XXXを登録しました。"
  #     end

  #     context "不正なパラメータに対して" do
  #       before { attrs["name"] = "" }
  #       it_behaves_like "レスポンスコード確認", 422
  #       it_behaves_like "オブジェクト数が変化しない?", <%= class_name %>
  #       it_behaves_like "Alert メッセージ確認", "XXXの登録に失敗しました。"
  #     end
  #   end

  #    context "not owned object" do
  #      let(:attrs) { not_mine.attributes }
  #      it_behaves_like "レスポンスコード確認", 302
  #      it_behaves_like "rootリダイレクト確認"
  #    end
  #  end

リダイレクト確認

クラスを作成する create の spec を再掲します。昨日は「オブジェクトが1増えるか?」を説明しましたので、今日はその次の「リダイレクト確認」になります。リダイレクト先はその上の return_path で設定をしています。今回は、create の describe の中で return_path を設定していますが、多くのコントローラでは同じページに戻ることが多いので、describe の外側で return_path を設定することも多いです。

    let(:can_delete) { kurasus :can_delete }
    let!(:attrs) { can_delete.attributes }
    (中略)

    describe "POST #create" do
      subject { -> { post teacher_kurasus_path, params: {kurasu: attrs} } }
      before { can_delete.destroy }
      let(:return_path) { teacher_kurasus_path(gakka_id: can_delete.gakka_id) }
      it_behaves_like "レスポンスコード確認", 302
      it_behaves_like "オブジェクトが1増えるか?", Kurasu
      it_behaves_like "リダイレクト確認"
      it_behaves_like "Notice メッセージ確認", "クラスを登録しました。"
    end

この shared_example は以下のようになります。subject.call した前後で、return_path にリダイレクトしているかを確認しているだけです。先に説明した 「rootリダイレクト確認」のパスがreturn_path で可変になっているだけですね。

shared_examples_for "リダイレクト確認" do
  it do
    subject.call
    expect(response).to redirect_to(return_path)
  end
end

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

こちらも普通にリダイレクトすれば正しく動作するはずです。

おわりに

create の成功パターンはあと一つです。なんとか25日まで続きそうです。