💡
この記事は Middleman 時代に書いた古いものです。記録のため、astro-notion-blog に移行していますが、あまり参考にしないでください。
request spec による destroy のテストと実装
-
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
-
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 のテストと実装
-
最後は 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
-
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
-
最終的な 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 "クラスを表示する権限がありません."
長くなったので今日はここまで