2012-06-27 1 views
31

Ho appena appreso quanto siano interessanti RSpec e Cabybara e ora sto lavorando attorno per imparare a scrivere test effettivi.Reindirizzamento del test con RSpec e Capybara (Rails)

Sto cercando di verificare se dopo aver fatto clic su un collegamento, c'è un reindirizzamento a una pagina specifica. Di seguito è lo scenario

 

1) I have a page /projects/list 
     - I have an anchor with html "Back" and it links to /projects/show 

Below is the test i wrote in rspec 

describe "Sample" do 
    describe "GET /projects/list" do 
    it "sample test" do 
     visit "/projects/list" 
     click_link "Back" 
     assert_redirected_to "/projects/show" 
    end 
    end 
end 

Il test ha esito negativo con un messaggio di errore come qui di seguito

 
    Failure/Error: assert_redirected_to "/projects/show" 
    ArgumentError: 
     @request must be an ActionDispatch::Request 

Si prega di suggerire me su come devo testare il reindirizzamento e quello che sto facendo male?

risposta

68

Prova current_path.should == "/projects/show"

Capybara implementa anche un metodo current_url per l'URL completo.

Ulteriori informazioni nel docs.

+3

potrebbe essere meglio usare' projects_path'? E forse anche usare la notazione 'expect' mentre ci sei, – SuckerForMayhem

-2

È necessario utilizzare il percorso, qualcosa come:

assert_redirected_to projects_path 

piuttosto che

assert_redirected_to "/projects/show" 
+0

Quando uso come 'assert_redirected_to projects_path' mostra come' non definito variabile locale o metodo 'projects_path' per # ' – balanv

+0

è necessario project_show_path in questo caso –

4

Dal Devise wiki:

In Rails quando un redirect applicazione cremagliera (proprio come Warden/Devise ti reindirizza alla pagina di accesso), la risposta non viene correttamente aggiornata dalla sessione di integrazione. Di conseguenza, l'helper assert_redirected_to non funzionerà.

Anche questa pagina è la stessa informazione: Rspec make sure we ended up at correct path

quindi è necessario mettere alla prova che sei ora su quel URL, invece di test che vi viene reindirizzati ad esso.

10

non sono sicuro che questo può essere quello che ti serve, ma nel mio test io preferisco questo approccio:

... 
subject { page } 
... 
before do 
    visit some_path_path 
    # do anything else you need to be redirected 
end 
it "should redirect to some other page" do 
    expect(page.current_path).to eq some_other_page_path 
end 
+0

' page.current_path' non è necessario, potresti usare solo 'current_path' dato che hai già dichiarato' page' come soggetto – mitra