2012-12-15 4 views
7

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?

+0

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

Antwort

3

Ich beantworte diese Frage von der POV, dass das, was Sie testen möchten, anderswo besser getestet werden würde. Wenn Sie eine Menge Probleme haben, den Test einrichten, stehen die Chancen gibt es einen besseren Weg, um es zu testen :)

  1. Testing, die Nachrichten blinken gelöscht bekommen - Flash-Mitteilungen sind in den Schienen, so dass es doesn‘ Es macht viel Sinn, etwas zu testen, das das Framework für Sie verarbeitet.

  2. Testen, ob Elemente auf der Seite angezeigt werden - die Ansichtsspezifikationen gehören nicht zu den Controllern.Hier ist eine Beschreibung der Rolle des Controllers:

    Ein Controller kann somit als ein Mann zwischen den Modellen und betrachtet werden. Sie stellt die Modelldaten für die Ansicht zur Verfügung, sodass sie diese Daten für den Benutzer anzeigen können.

    Der Controller soll Daten für die Ansicht verfügbar machen, nicht um anzugeben, wie die Daten gerendert werden. Stellen Sie sich vor, wenn Sie den Namen Ihrer CSS-Klasse geändert hätten, müssten Sie auch Ihre Controller-Spezifikationen aktualisieren.

    Wenn Sie wirklich testen möchten, dass Flash-Nachrichten angezeigt werden, würde ich einen Integrationstest verwenden.