📘 hkob-astro-notion-blog

これまではてなブログにて情報発信をしていましたが、令和5年3月22日より、こちらでの情報発信を始めました。2019年以前の古い記事は過去の Middleman 時代のものなので、情報が古いです。記録のためだけに残しています。

kurasus_controller の request spec(4) - 不定期刊 Rails App を作る(19)

💡
この記事は Middleman 時代に書いた古いものです。記録のため、astro-notion-blog に移行していますが、あまり参考にしないでください。
request spec による destroy のテストと実装
  1. DELETE #destroy の spec を spec/requests/kurasus_spec.rb に記載する. destroy でも :id で指定された一つのクラスを取得する. クラスは削除できない条件がないので,削除に成功する場合,他人のクラスを取得した場合の二種類を確認できればよい. 利用した shared_example は以下の通りである(追加分).
    • decrement_object_by_destroy: 削除の結果,データの個数が減ったかを確認
    describe 'DELETE #destroy' do
      context 'owned object' do
        subject { -> { delete kurasu_path(object), params: {kurasu: @attrs} } }
        it_behaves_like :response_status_check, 302
        it_behaves_like :decrement_object_by_destroy, Kurasu
        it_behaves_like :redirect_to
        it_behaves_like :flash_notice_message, 'クラスを削除しました.'
      end
    
      context 'now owned object' do
        subject { -> { delete kurasu_path(not_mine), params: {kurasu: @attrs} } }
        it_behaves_like :redirect_to
        it_behaves_like :flash_alert_message, 'クラスを削除する権限がありません.'
      end
    end
  2. DELETE #destroy の実装を app/controllers/kurasus_controller.rb に記載する.
    def destroy
      redirect_to(kurasus_path, alert: alert_message(Kurasu)) and return if @kurasu.nil?
      @kurasu.destroy
      redirect_to kurasus_path, notice: notice_message(Kurasu)
    end
request spec による show のテストと実装
  1. 最後は show である. このページは後日 gakusei の一覧を表示するページとなるが,まだモデルがないのでタイトルだけ表示することにする. spec は以下のようになる.
    describe 'GET #show' do
      context 'owned object' do
        subject { -> { get kurasu_path(object) } }
        it_behaves_like :response_status_check, 200
        it_behaves_like :response_body_includes, %w[クラス表示: 2300 (小林弘幸)]
      end
    
      context 'now owned object' do
        subject { -> { get kurasu_path(not_mine) } }
        it_behaves_like :response_status_check, 302
        it_behaves_like :redirect_to
        it_behaves_like :flash_alert_message, 'クラスを表示する権限がありません.'
      end
    end
  2. GET #show の実装を app/controllers/kurasus_controller.rb に記載する.
    def show
      redirect_to(kurasus_path(edit_mode: true), alert: alert_message(Kurasu)) and return if @kurasu.nil?
    end
  3. 最終的な guard 出力はこんな感じになった(本日分のみ).全てテストが通過している.
    DELETE #destroy
      owned object
        behaves like response_status_check
          response should be 302
        behaves like decrement_object_by_destroy
          should change `Kurasu.count` by -1
        behaves like redirect_to
          should redirect to "/kurasus?edit_mode=true"
        behaves like flash_notice_message
          should eq "クラスを削除しました."
      now owned object
        behaves like response_status_check
          response should be 302
        behaves like redirect_to
          should redirect to "/kurasus?edit_mode=true"
        behaves like flash_alert_message
          should eq "クラスを削除する権限がありません."
    
    GET #show
      owned object
        behaves like response_status_check
          response should be 200
        behaves like response_body_includes
          response body includes ["クラス表示:", "2300", "(小林弘幸)"]
      now owned object
        behaves like response_status_check
          response should be 302
        behaves like redirect_to
          should redirect to "/kurasus?edit_mode=true"
        behaves like flash_alert_message
          should eq "クラスを表示する権限がありません."

長くなったので今日はここまで