Ich bin mir nicht sicher, wie man Flash-Nachrichten mit Funktionstests überprüfen. Mein Problem hat etwas mit redirect_to
zu tun, weil mein Test für flash[:error]
besteht. Hier ist, was meine create
Aktion wie folgt aussieht:Funktionstests für Flash-Nachrichten nach Umleitung
def create
@user = User.new(params[:user])
if @user.save
redirect_to @user, flash: { success: "Welcome!" }
else
flash.now[:error] = "Signup failed:"
render 'new'
end
end
ich eine vorübergehende Test für flash[:error]
haben, die 1) überprüft, ob flash[:error]
der richtige Wert ist, 2) überprüft die Seite für den Flash-div und 3) bekommt einen neuen Seite und überprüft, ob die Flash-Nachricht gelöscht wurde. Ich habe versucht, einen analogen Test für flash[:success]
zu machen, aber es scheitert, wenn es versucht, das Div auf der Seite zu finden. Hier ist der fehlerhafte Test:
should "show flash[:success] message" do
post :create, user: { name: "valid user",
password: "userpw",
password_confirmation: "userpw",
email: "[email protected]" }
assert_redirected_to user_path(assigns(:user)), "user isn't being redirected to their page after registration"
assert_equal flash[:success], "Welcome!", "flash[:success] isn't being set properly"
assert_select "div.alert-success", flash[:success]
get :new
assert flash.empty?, "there shouldn't be any flash messages left after getting new page"
end
Wenn ich dies zu testen manuell in einem Browser, es verhält sich wie erwartet, aber ich bin nicht sicher, wie die Tests zu schreiben, dies zu reflektieren. Die ersten beiden Assertions werden übergeben (der Test erkennt also, dass er korrekt umgeleitet wird und dass flash[:success]
auf "Welcome!"
gesetzt wird). Auf dieser Basis würde ich glaube, die assert_select
Aussage über die div zu finden wäre in der Lage, aber wenn nicht mit dieser Fehlermeldung:
Expected at least 1 element matching "div.alert-success", found 0.
Also habe ich versuchte puts @response.body
direkt vor der assert_select
Erklärung hinzufügen, die diese gedruckt:
Dies erklärt, warum es das Flash div nicht finden konnte, aber ich bin mir nicht sicher, wie man die Umleitung "beendet", damit es die korrekte Ansicht mit dem Blitz div macht. Wenn ich eine get
Anweisung direkt vor der assert_select
Anweisung hinzufüge, wird der Test bestanden, denn jetzt hat @response.body
das Flash div. Dies scheint jedoch kein effektiver Test zu sein, da es nicht das Verhalten meiner Anwendung widerspiegelt - der Benutzer muss keine neue Anfrage stellen, um die Flash-Nachricht zu sehen.
Es garantiert auch nicht, dass die Flash-Nachricht auf der richtigen Seite angezeigt wird. Wenn ich die Anweisung get :new
verwende, wird die Assertion weiterhin ausgeführt, was bedeutet, dass die Flash-Nachricht in der Sicht users#new
angezeigt wird. Auch wenn ich
get :show, id: assigns(:user).id
auf die Flash-Mitteilung auf der richtigen Seite zeigt sich vergewissern Sie sich, das fühlt sich immer noch falsch, weil 1) jetzt ist es eine success
Antwort anstelle einer redirect
Antwort, und 2) es doesn noch‘ t erklären, warum ich manuell haben zu einer beliebigen Seite fordern Sie die Flash-div zu finden - nach der docs „der Blitz ein besonderer Teil der Sitzung ist die mit jeder Anforderung gelöscht ist“
auf jeden Fall ist es ein Möglichkeit zu testen, dass eine Flash-Nachricht nach einer Weiterleitung korrekt angezeigt wird?
Ich habe das gleiche Problem. Ich fand, dass, wenn ich umleiten von einer Aktion, die von get aufgerufen wird, scheint es zu funktionieren, dh die assert_select hat Zugriff auf die umgeleitete Ansicht, aber wenn ich umleiten von einer Aktion durch "post" aufgerufen sieht es nur die "Sie werden umgeleitet ..." Seite. Sehr nervig. Ich habe versucht, follow_redirect zu verwenden! aber das ist nicht in Funktionstests verfügbar. –