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


今回のコミット内容
https://dev.azure.com/nightonly/rails-app-origin/_git/rails-app-origin/commit/1f477b4ec1138c9afe7870a989f6e700de9e1e97?refName=refs/heads/space_develop&path=/spec/requests/members/result_spec.rb

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です