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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top