リダイレクト時に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が出なくなりました。
