Rspec - Rails - Wie eine Umleitung folgen
-
30-09-2019 - |
Frage
Wer weiß, wie man eine Umleitung rspec folgen (in einer Controller-Spezifikation)? (Z Test / Einheit hat follow_redirect!)
Ich habe "follow_redirect!", Versuchte und "follow_redirect" aber nur bekommen
undefined method `follow_redirect!' for #<Spec::Rails::Example::ControllerExampleGroup::Subclass_1:0xb6df5294>
Zum Beispiel:
Wenn ich ein Konto der Seite erstellen, um Konten Seite umgeleitet wird und mein neues Konto sollte an der Spitze der Liste sein.
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! Bedürfnisse etwas geändert werden, die tatsächlich funktioniert.
Lösung
Wenn Sie die Umleitung testen möchten, dass Sie außerhalb des bewegen rspec-Schienen-Domäne.
Sie können mit webrat oder einem anderen Integrations-Test-Framework diese testen.
Der einfachste Weg, dies zu lösen, ohne zu Integrationstests zurückzugreifen ist wahrscheinlich die Methode zu verspotten, die die Umleitung verursacht.
Andere Tipps
Ich denke, das ist das Standardverhalten für rspec-Schienen Controller-Tests in dem Sinne, dass Sie eine Erwartung auf dem Antwortstatus und / oder Pfad und Test für den Erfolg einstellen.
Zum Beispiel:
it "should create an account" do
post :create
response.code.should == "302"
response.should redirect_to(accounts_path)
end
Sie können auf die Umleitung Lage mit
response.headers['Location']
Sie könnten verlangen dann, dass direkt an.
Versuchen Integration / Nachfrage-Tests zu verwenden. Sie sind mit stegartigen Zugang durch Controller routen.
Beispielsweise:
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 gesendet werden soll (für grundlegende http Autorisierung).
env={'HTTP_AUTHORIZATION' => ActionController::HttpAuthentication::Basic.encode_credentials(user,password)}
post_via_redirect "/fps", {:fp => fp_params}, env
ist in Ordnung für erstellen, aber nach Umleitung es gibt 401 und neue Genehmigung benötigt. So habe ich es in zwei Tests aufgeteilt:. Erstellung und zeigt auf dem Ergebnis der Schöpfung
Die Spezifikation ist der Rahmen aus, wenn Sie eine Umleitung Nutzungsanforderungsspezifikation folgen wollen, um das Äquivalent von Integrationstest in Test :: Unit.
Anfrage Spezifikationen follow_redirect!
Werke sowie in Test :: Unit.
Oder wenn Sie inmediately umleiten verwenden _via_redirect
als Suffix für das Verb, Beispiel:
post_via_redirect :create, user: @user
Für RSpec / Capybara + Rails
response_headers['Location']
Aber es funktioniert nur, wenn es keine Verzögerung vor Umleitung. Wenn es da ist, dann ist es schwieriger, die Logik zu folgen.