web-dev-qa-db-fra.com

Rspec 3 comment tester les messages flash

Je souhaite tester l'action du contrôleur et la présence de messages flash avec rspec.

action:

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

spec:

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

Mais j'ai une erreur:

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

Vous testez la présence de flash[:success], Mais dans votre contrôleur vous utilisez flash[:notice]

63
rabusmar

Le meilleur moyen de tester les messages flash est fourni par la gemme devrait .

Voici trois exemples:

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

Si vous êtes plus intéressé par le contenu des messages flash, vous pouvez utiliser ceci:

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

ou

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

Je vous déconseille de rechercher un message spécifique à moins que ce message ne soit critique et/ou qu'il ne change pas souvent.

27
Mugur 'Bud' Chirica

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

Le .now devrait être appelé directement sur le set_flash.

En utilisant set_flash avec le qualificatif now et en spécifiant now après d'autres qualificatifs n'est plus autorisé.

Vous voudrez utiliser now immédiatement après set_flash. Par exemple:

# 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
1
killerkiara

Une autre approche consiste à laisser de côté le fait qu'un contrôleur a des messages flash et à écrire un test d'intégration. De cette façon, vous augmentez les chances que vous n'ayez pas besoin de modifier le test une fois que vous avez décidé d'afficher ce message en utilisant JavaScript ou d'une autre manière.

Voir aussi https://stackoverflow.com/a/13897912/2987689

0
Artur Beljajev