it-swarm.com.de

Lesen Sie 3, wie Sie Flash-Nachrichten testen

Ich möchte die Aktion des Controllers und das Vorhandensein von Flash-Meldungen mit rspec testen.

Aktion:

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
...

Aber ich habe einen Fehler:

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

Sie prüfen auf das Vorhandensein von flash[:success], aber in Ihrem Controller verwenden Sie flash[:notice]

63
rabusmar

Der beste Weg, um Flash-Nachrichten zu testen, ist das shoulda gem.

Hier sind drei Beispiele:

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

Wenn Sie mehr am Inhalt der Flash-Nachrichten interessiert sind, können Sie dies verwenden:

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

oder

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

Ich rate davon ab, nach einer bestimmten Nachricht zu suchen, es sei denn, diese Nachricht ist kritisch und/oder ändert sich nicht oft.

27

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

Der .now Sollte direkt auf dem set_flash Aufgerufen werden.

Die Verwendung von set_flash Mit dem Qualifikationsmerkmal now und die Angabe von now nach anderen Qualifikationsmerkmalen ist nicht mehr zulässig.

Sie möchten now unmittelbar nach set_flash Verwenden. Zum Beispiel:

# 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

Der andere Ansatz besteht darin, die Tatsache auszulassen, dass ein Controller stattdessen Flash-Nachrichten hat und einen Integrationstest schreibt. Auf diese Weise erhöhen Sie die Wahrscheinlichkeit, dass Sie den Test nicht mehr ändern müssen, wenn Sie diese Nachricht mit JavaScript oder auf eine andere Weise anzeigen möchten.

Siehe auch https://stackoverflow.com/a/13897912/2987689

0
Artur Beljajev