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
Vous testez la présence de flash[:success]
, Mais dans votre contrôleur vous utilisez flash[:notice]
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
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.
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
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