2010-05-19 12 views
37

Kann jemand rspec eine Umleitung (in einer Controller-Spezifikation) folgen? (z. B. Test/Gerät hat Follow_redirect!)Rspec - Rails - Wie folgt man einer Umleitung

Ich habe versucht "follow_redirect!" und „follow_redirect“ aber nur

undefined method `follow_redirect!' for #<Spec::Rails::Example::ControllerExampleGroup::Subclass_1:0xb6df5294> 

Zum Beispiel erhalten:
Wenn ich ein Konto erstellen die Seite Konten Seite und mein neues Konto umgeleitet wird, an der Spitze der Liste sein sollte.

it "should create an account" do 
    post :create, :name => "My New Account" 
    FOLLOW_REDIRECT! 
    response.code.should == "200" 
    accounts = assigns[:accounts] 
    accounts[0].name.should == "My New Account" 
end 

Aber FOLLOW_REDIRECT! muss zu etwas geändert werden, das tatsächlich funktioniert.

Antwort

19

Wenn Sie die Umleitung testen Sie außerhalb der rspec-Schienen Domäne bewegen.

Sie können dies mit Webrat oder einem anderen Integrationstest-Framework testen.

Der einfachste Weg, dies zu lösen, ohne auf Integrationstests zurückgreifen zu müssen, ist wahrscheinlich, die Methode, die die Umleitung verursacht, auszutricksen.

+1

ich denke, diese Antwort ist falsch, die von Zetetic ist korrekt – jpwynn

+4

Eigentlich ist diese Antwort * korrekt, und meins ist nicht. Meine Antwort zeigt nur, wie überprüft werden kann, dass eine Umleitung stattfindet - OP fragte, wie der Inhalt der Antwort nach der Weiterleitung getestet werden soll. – zetetic

64

Ich denke, das ist das Standardverhalten für rspec-rails Controller-Tests, in dem Sinne, dass Sie eine Antwort auf den Antwortstatus und/oder Pfad festlegen und auf Erfolg testen können.

Zum Beispiel:

it "should create an account" do 
    post :create 
    response.code.should == "302" 
    response.should redirect_to(accounts_path) 
end 
+0

Hallo zetetic. Danke für deine Antwort. Was Sie in Ihrer Antwort beschreiben, wäre der richtige Weg, um zu überprüfen, ob die Antwort eine 302-Weiterleitung zum accounts_path ist. Ich möchte der Weiterleitung zum accounts_path folgen und das Verhalten dieser Seite überprüfen. Z.B. Überprüfen Sie, ob mein neues Konto dort aufgeführt ist. –

+0

Ich habe meine Frage aktualisiert, hoffe, es stört dich nicht, dass ich dein Beispiel geliehen habe. –

+1

Raten Sie, ich habe die Frage falsch verstanden. Würde 'integrate_views' in dieser Situation helfen? – zetetic

23

können Sie die Umleitung Zugriff Lage mit

response.headers['Location'] 

Sie dann, dass direkt anfordern können.

+5

Dies ist die einzige direkte Antwort auf das OP. Andere sagen, was ** sollte ** getan werden, aber dies ist die einzige, die sagt, wie zu tun ist, was angefordert wird. Das ist hilfreich, wenn jemand wie ich von einer Google-Anfrage herkommt. –

+0

Das würde funktionieren, aber sicher sein, "response.params" zu deklarieren, falls vorhanden. Zum Beispiel möchte ich vielleicht testen, dass meine Weiterleitung eine bestimmte Flash-Nachricht rendert. testet ein 'GET response.headers ['Location']' allein wird das nicht tun. –

0

Für RSpec/Capybara + Rails

response_headers['Location'] 

Aber es funktioniert nur, wenn es keine Verzögerung vor Umleitung ist. Wenn es dort ist, dann ist es schwieriger, der Logik zu folgen.

+0

dies ist nicht definiert, aber 'response.headers ['Location']' funktioniert –

2

Versuchen Sie, Integrations-/Anforderungstests zu verwenden. Sie verwenden webähnlichen Zugang durch Routing zu Controllern. Zum Beispiel: Ich habe für Rails 2 app in Datei /spec/integration/fps_spec.rb

require 'spec_helper' 

describe "FinPoradci" do 

    it "POST /fps.html with params" do 
    fp_params={:accord_id => "FP99998", :under_acc => "OM001", :first_name => "Pavel", :last_name => "Novy"} 
    fp_test=FinPoradce.new(fp_params) 
    #after create follow redirection to show 
    post_via_redirect "/fps", {:fp => fp_params} 
    response.response_code.should == 200 # => :found , not 302 :created 
    new_fp=assigns(:fp) 
    new_fp.should_not be_empty 
    new_fp.errors.should be_empty 
    flash[:error].should be_empty 
    flash[:notice].should_not be_empty 
    response.should render_template(:show) 
    end 
end 

und es funktioniert. Bis Sie Header senden möchten (für grundlegende HTTP-Autorisierung).

env={'HTTP_AUTHORIZATION' => ActionController::HttpAuthentication::Basic.encode_credentials(user,password)} 
post_via_redirect "/fps", {:fp => fp_params}, env 

ist für schaffen Ordnung, aber nach Umleitung gibt es 401 und neue Genehmigung benötigt. SO muss ich es in 2 Tests teilen: Erstellung und Show am Ergebnis der Erstellung.

1

Die Spezifikation ist außerhalb des Gültigkeitsbereichs, wenn Sie einer Umleitungsanwendungsspezifikation folgen möchten, die dem Integrationstest in Test :: Unit entspricht.

In den technischen Daten follow_redirect! funktioniert so gut wie in Test :: Unit.

Oder wenn Sie inmediately _via_redirect als Suffix für das Verb, zB umleiten:

post_via_redirect :create, user: @user 
+0

Dies gibt 'undefined lokale Variable oder Methode' post_via_redirect' zurück. Habe ich etwas falsch gemacht? Wo würdest du diese Methode nennen? –

Verwandte Themen