所有しないオブジェクトの処理(テストを追加): 小林研 Rails Tips (80)

このページの内容は以下のリポジトリに1日遅れで反映されます(記事執筆前に前日分をコミットしています)。

https://github.com/hkob/hkob_blog

はじめに

Rails Tips の 80 回目です。昨日は所有しないオブジェクトに対する edit の対応を行いました。すでに共有実装部分を修正したので、update や destroy も対応が済んでいます。念のため、テストで対応が済んでいることを確認しましょう。

Rails をはじめよう - Railsガイド

article_spec

update も object の部分を one に変えて、それを let で切り替えます。

    describe "PATCH #update" do
      subject { -> { patch article_path(one), params: {article: attrs} } }
      context "when owned object" do
        let(:one) { object }
        let(:return_path) { article_path(object) }
        context "正しいパラメータに対して" do
          before { attrs["title"] = "ABC" }
          it_behaves_like "レスポンスコード確認", 302
          it_behaves_like "オブジェクト属性が変化した?", Article, :title, "ABC"
          it_behaves_like "リダイレクト確認"
          it_behaves_like "Notice メッセージ確認", "記事を更新しました。"
        end

        context "不正なパラメータに対して" do
          before { attrs["title"] = "" }
          it_behaves_like "レスポンスコード確認", 422
          it_behaves_like "オブジェクト属性が変化しない?", Article, :title
          it_behaves_like "Alert メッセージ確認", "記事の更新に失敗しました。"
        end
      end

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

これで not_mine の時に正しく処理されていることがわかります。同様に destroy のテストも修正しましょう。

    describe "DELETE #destroy" do
      subject { -> { delete article_path(one) } }
      context "when owned object" do
        let(:one) { object }
        let(:return_path) { articles_path }
        it_behaves_like "レスポンスコード確認", 303
        it_behaves_like "オブジェクトが1減るか?", Article
        it_behaves_like "リダイレクト確認"
        it_behaves_like "Notice メッセージ確認", "記事を削除しました。"
      end

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

こちらも無事にテストが通過しています。

おわりに

これで article に関する所有権のテストが完了しました。明日はこれに合わせて index などの描画を修正します。