リダイレクト時にflashメッセージを渡して、リダイレクト先でflashメッセージが表示する事はよくあると思います。
前者(正しいflashメッセージを渡したか?)と、後者(受け取ったflashメッセージを正しく処理できたか?)のテストを書く事になります。
alertやnotice出すだけなら後者は書かないことが多いですが、二重登録されないようにリダイレクトでflash渡して結果を表示するようにしたので、テストも書いてみました。
前者(正しいflashメッセージを渡したか?)
shared_examples_for 'ToOK(html/*)' do it 'メンバー招待(結果)にリダイレクトする' do is_expected.to redirect_to(result_member_path(space.code)) expect(flash[:alert]).to be_nil expect(flash[:notice]).to eq(get_locale('notice.member.create')) expect(flash[:emails]).to eq(emails) expect(flash[:exist_user_mails]).to eq([exist_user.email]) expect(flash[:create_user_mails]).to eq([new_user.email]) expect(flash[:power]).to eq(attributes[:power].to_s)
※get_localeは定義されているかチェックしてlocaleを返却しています。
後者(受け取ったflashメッセージを正しく処理できたか?)
ruby on rails – How to stub a flash in a RSpec spec? – Stack Overflow
古い書き方
> YourController.any_instance.stub(:flash) { {some: “thing” }}
shared_examples_for 'ToOK(html/*)' do before do MembersController.any_instance.stub(:flash) do { emails: emails, exist_user_mails: exist_user_mails, create_user_mails: create_user_mails, power: power } end end it 'HTTPステータスが200。対象項目が含まれる' do is_expected.to eq(200) expect_space_html(response, space) expect(response.body).to include("#{emails.count}名中") expect(response.body).to include("招待: #{create_user_mails.count}名") expect(response.body).to include("参加中: #{exist_user_mails.count}名") expect(response.body).to include("未登録: #{emails.count - create_user_mails.count - exist_user_mails.count}名")
※expect_space_htmlはテスト内容を共通化しています。
これだとDeprecation Warning(いずれなくなる)が出ます。
Deprecation Warnings: Using `any_instance` from rspec-mocks' old `:should` syntax without explicitly enabling the syntax is deprecated. Use the new `:expect` syntax or explicitly enable `:should` instead. Called from spec/requests/members/result_spec.rb:41:in `block (4 levels) in'.
新しい書き方
> allow_any_instance_of(described_class).to receive(:flash).and_return(some: “thing”)
before do allow_any_instance_of(MembersController).to receive(:flash).and_return( { emails: emails, exist_user_mails: exist_user_mails, create_user_mails: create_user_mails, power: power } ) end
これでWarningが出なくなりました。