はじめに
Rails Tips の 25 回目です。今日は 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
Notice メッセージ確認
クラスを作成する create の spec を再掲します。昨日は「リダイレクト確認」を説明しましたので、今日は正常系最後の「Notice メッセージ確認」になります。リダイレクト時に「クラスを登録しました。」というメッセージが Notice として表示されることを確認します。
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
した後で、Notice メッセージを確認しているだけです。雛形には「XXXを登録しました。
」とテンプレートの文字列を用意してあるので、XXX の部分をそのモデルの名前に置換するだけです。これで全ての Notice や Alert のメッセージが書き換える形になります。
shared_examples_for "Notice メッセージ確認" do |str| it "notice に「#{str}」が出力されること" do subject.call expect(flash.now[:notice]).to eq str end end
正しく動作させるための実装
create action には以下のように記載しています。ここでは、notice_message, alert_message: 小林研 Rails Tips (17) - hkob’s blog で説明した notice_message(Kurasu)
を使います。これによって、日本語の表記揺れがなくなり、テストも簡単になります。
def create @kurasu = Kurasu.create kurasu_params redirect_to teacher_kurasus_path(gakka_id: @kurasu.gakka_id), notice: notice_message(Kurasu) end
おわりに
ユカスタマスの目的であった12月1日から12月25日までの連続記事掲載が無事に終わりました。ただし、RailsTips 自体はまだネタがあるので、連続掲載は今後も継続していく予定です。