はじめに
Rails Tips の 23 回目です。今日からは 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
オブジェクトが1増えるか?
クラスを作成する create の spec は以下のようになっています。レスポンスコード確認は index でも使っていました。こちらはリダイレクトなので 302 になります。今日説明するのはその次の「オブジェクトが1増えるか?」になります。create なので実行後にオブジェクトが一つ増えることを確認します。
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 した前後で、そのクラスの数が一つ増えたかどうかを確認しているだけです。
shared_examples_for "オブジェクトが1増えるか?" do |klass| it "#{klass}.count が 1 つ増えること" do expect { subject.call }.to change(klass, :count).by 1 end end
正しく動作させるための実装
こちらは new + save が正しく動けば当然オブジェクトは 1 つ増えるので、特に問題はないと思います。
おわりに
今日から create に入りました。テスト自体は非常に簡単なものの集合体ですね。