RSpec - Rails - Come seguire un redirect
-
30-09-2019 - |
Domanda
Qualcuno sa come fare RSpec seguire un reindirizzamento (in una specifica di controllo)? (Per esempio test / unit ha follow_redirect!)
ho provato "follow_redirect!" e "follow_redirect", ma solo ottenere
undefined method `follow_redirect!' for #<Spec::Rails::Example::ControllerExampleGroup::Subclass_1:0xb6df5294>
Ad esempio:
Quando creo un account la pagina viene reindirizzato alla pagina conti e il mio nuovo account dovrebbe essere in cima alla lista.
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
Ma FOLLOW_REDIRECT! ha bisogno di essere cambiato a qualcosa che funziona davvero.
Soluzione
Se si desidera verificare il redirect si sta spostando al di fuori del RSpec-rotaie dominio.
È possibile utilizzare Webrat o qualche altro framework di integrazione-test per testare questo.
Il modo più semplice per risolvere questo senza ricorrere a test di integrazione è probabilmente quello di deridere il metodo che causa il reindirizzamento.
Altri suggerimenti
Credo che questo è il comportamento di default per RSpec-rails test del controller , nel senso che è possibile impostare un'aspettativa sullo stato di risposta e / o il percorso, e il test per il successo.
Ad esempio:
it "should create an account" do
post :create
response.code.should == "302"
response.should redirect_to(accounts_path)
end
È possibile accedere al percorso di reindirizzamento con
response.headers['Location']
si potrebbe allora chiedere che direttamente.
Prova ad utilizzare i test di integrazione / richiesta. Stanno usando accesso web-like attraverso il routing ai controllori.
Per esempio:
Ho per Rails 2 applicazione nel file di /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
e funziona. Fino a quando si desidera inviare le intestazioni (per l'autorizzazione di base HTTP).
env={'HTTP_AUTHORIZATION' => ActionController::HttpAuthentication::Basic.encode_credentials(user,password)}
post_via_redirect "/fps", {:fp => fp_params}, env
va bene per creare, ma dopo il reindirizzamento restituisce 401 e ha bisogno di nuova autorizzazione. Quindi devo dividerlo in 2 prove:. Creazione e show su risultato di creazione
La specifica è fuori portata, se si vuole seguire una richiesta specifica uso di reindirizzamento, l'equivalente di test di integrazione in Test :: Unit.
Nella richiesta specifiche opere follow_redirect!
così come in Test :: Unit.
Se si desidera reindirizzare inmediately utilizzare _via_redirect
come suffisso per il verbo, ad esempio:
post_via_redirect :create, user: @user
Per RSpec / Capybara + Rails
response_headers['Location']
Ma funziona solo se non v'è alcun ritardo prima di reindirizzamento. Se è lì, allora è più difficile seguire la logica.