Rspec3フラッシュメッセージをテストする方法


81

rspecでコントローラーのアクションとフラッシュメッセージの存在をテストしたい。

アクション

def create
  user = Users::User.find_by_email(params[:email])
  if user
    user.send_reset_password_instructions
    flash[:success] = "Reset password instructions have been sent to #{user.email}."
  else
    flash[:alert] = "Can't find user with this email: #{params[:email]}"
  end

  redirect_to root_path
end

スペック

describe "#create" do
  it "sends reset password instructions if user exists" do
    post :create, email: "email@example.com"      
    expect(response).to redirect_to(root_path)
    expect(flash[:success]).to be_present
  end
...

しかし、エラーが発生しました:

Failure/Error: expect(flash[:success]).to be_present
   expected `nil.present?` to return true, got false

回答:


67

の存在をテストしていflash[:success]ますが、コントローラーで使用していますflash[:notice]


ああ、すみません、私はちょうどここに滑りました。flash [:notice]で同じエラー
Mike Andrianov 2014

3
その場合、問題はおそらくコントローラーコードやテストデータにあります。変更しようexpect(flash[:notice])expect(flash[:alert])、そしてテストはその後、合格した場合、おそらくそれは、テストメールが存在しないということだけです。
rabusmar 2014

48

フラッシュメッセージをテストする最良の方法は、shouldagemによって提供されます。

次に3つの例を示します。

expect(controller).to set_flash
expect(controller).to set_flash[:success]
expect(controller).to set_flash[:alert].to(/are not valid/).now

34

フラッシュメッセージの内容にもっと興味がある場合は、これを使用できます。

expect(flash[:success]).to match(/Reset password instructions have been sent to .*/)

または

expect(flash[:alert]).to match(/Can't find user with this email: .*/)

特定のメッセージが重要であるか、頻繁に変更されない場合を除いて、特定のメッセージをチェックしないことをお勧めします。


5

と: gem 'shoulda-matchers', '~> 3.1'

.now直接に呼び出されなければなりませんset_flash

修飾子set_flashとともに使用してnow指定するnow他の修飾子の後にはできなくなりました。

now直後に使用することをお勧めしますset_flash。例えば:

# Valid
should set_flash.now[:foo]
should set_flash.now[:foo].to('bar')

# Invalid
should set_flash[:foo].now
should set_flash[:foo].to('bar').now

0

もう1つのアプローチは、コントローラーにフラッシュメッセージがあるという事実を除外し、代わりに統合テストを書き込むことです。このようにして、JavaScriptを使用して、または別の方法でメッセージを表示することにした場合、テストを変更する必要がなくなる可能性が高くなります。

https://stackoverflow.com/a/13897912/2987689も参照してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.