2016-11-30 4 views
1

Ich habe eine RSPEZ-Test zum Testen einer Controller-Aktion.Testen der Controller-Umleitung in RSpec

class SalesController < ApplicationController 
    def create 
    # This redirect sends the user to SalesController#go_to_home 
    redirect_to '/go_to_home' 
    end 

    def go_to_home 
    redirect_to '/' 
    end 
end 

Mein Controller Test sieht aus wie

RSpec.describe SalesController, type: :controller do 
    include PathsHelper 

    describe 'POST create' do 
    post :create 

    expect(response).to redirect_to '/' 
    end 
end 

Allerdings, wenn ich den Test ausführen es mir, dass sagt:

Expected response to be a redirect to <http://test.host/> but was a redirect to <http://test.host/go_to_home>. 
    Expected "http://test.host/" to be === "http://test.host/go_to_home". 

/go_to_home wird der Benutzer zu SalesController # Springen_zum_Anfang senden. Wie kann ich testen, ob die Antwort letztendlich zur Homepage mit der URL http://test.host/ führt?

Antwort

1

Controller-Tests sind effektiv Komponententests - Sie testen den Effekt des Aufrufs einer einzelnen Aktion und das erwartete Verhalten dieser Aktion.

Die create Aktion hat eine Antwort wieder zurück mit einem Statuscode von 302 und enthält im Header eines Location den neuen URI angeben, die im Fall des Aufrufs Location: http://localhost/go_to_home

Dies ist wäre zu schaffen, so weit die Controller Test geht. Es hat einen Aufruf von einem Browser an die Erstellungsaktion emuliert und die anfängliche Umleitung empfangen.

In der realen Welt würde der Browser dann natürlich zu dem gegebenen Ort navigieren und würde dann die go_to_home Aktion treffen, aber dies ist außerhalb des Bereichs der Controller-Tests ... dies ist in der Domäne des Integrationstests.

Also, entweder,

  1. einen Integrationstest erstellen zunächst die create Aktion aufzurufen, folgen Sie der Umleitung und Test, den Sie auf ‚/‘ enden.
  2. Ändern der Controller-Test expect(response).to redirect_to '/go_to_home'
  3. Ändern der create Aktion '/'
2

Warum erwarten Sie eine Umleitung auf "/" in den Spezifikationen? Von dem Controller-Code Sie klebst Du ‚/ Springen_zum_Anfang‘ nach der Aktion erstellen treffen wird umgeleitet werden

Versuchen Sie, die Angaben zum Wechsel:

expect(response).to redirect_to '/go_to_home' 

Edit:

Ist derdiedas ein echte Beispiel oder der Code ist nur für das Teilen was Sie versuchen zu erreichen? Ich glaube nicht, dass rspec die Weiterleitung nach '/ go_to_home' folgen wird und ich denke, es ist in Ordnung.

Wenn Sie die Erstellungsaktion testen, ist es in Ordnung zu testen, dass die Weiterleitung zu '/ go_to_home' erfolgt, da dies die Aktion tut. Dann können Sie einen anderen Test für die andere Aktion go_to_home tun und erwarten, dass Redirects zu root.

Rufen Sie die Aktion 'go_to_home' von woanders an?

+0

direkt umleiten werde ich meine Frage klären. '/ go_to_home' sendet den Benutzer an SalesController # go_to_home. – jason328

+0

Nein, ich rufe nur go_to_home von SalesController # create an. Verstehe, dass ich dieses Beispiel vereinfacht habe, so dass eine Menge Logik fehlt. – jason328