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

RailsApp Rails RSpec 2018年 11月 29日

request spec による destroy のテストと実装

  1. DELETE #destroy の spec を spec/requests/kurasus_spec.rb に記載する. destroy でも :id で指定された一つのクラスを取得する. クラスは削除できない条件がないので,削除に成功する場合,他人のクラスを取得した場合の二種類を確認できればよい. 利用した shared_example は以下の通りである(追加分).
    • decrement_object_by_destroy: 削除の結果,データの個数が減ったかを確認
  2. 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
  3. DELETE #destroy の実装を app/controllers/kurasus_controller.rb に記載する.
  4. 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 に記載する.
  3. def show
      redirect_to(kurasus_path(edit_mode: true), alert: alert_message(Kurasu)) and return if @kurasu.nil?
    end
  4. 最終的な guard 出力はこんな感じになった(本日分のみ).全てテストが通過している.
  5. 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 "クラスを表示する権限がありません."

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