2012-06-27 3 views
31

Je viens juste d'apprendre à quel point RSpec et Cabybara sont géniaux, et je travaille maintenant pour apprendre à écrire des tests réels. J'essaie de vérifier si après avoir cliqué sur un lien, il y a une redirection vers une page spécifique. Ci-dessous le scénarioRedirection de test avec RSpec et Capybara (Rails)

 

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 

Le test échoue avec un message d'erreur comme ci-dessous

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

S'il vous plaît me suggérer sur la façon dont je devrais tester la redirection et ce que je fais mal?

Répondre

68

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

Capybara met également en œuvre une méthode current_url pour l'URL complète.

Plus d'informations dans le docs.

+3

peut-être préférable d'utiliser' projects_path'? Et peut-être aussi bien utiliser la notation 'expect' pendant que vous y êtes – SuckerForMayhem

-2

Vous devez utiliser la route, quelque chose comme:

assert_redirected_to projects_path 

plutôt que

assert_redirected_to "/projects/show" 
+0

Quand je l'utilise comme 'assert_redirected_to projects_path' il montre comme' variable locale non définie ou méthode 'projects_path » pour # ' – balanv

+0

vous avez besoin de projects_show_path dans ce cas –

4

De l'Devise wiki:

Dans Rails quand une redirection d'application rack (comme Warden/Devise vous redirige vers la page de connexion), la réponse n'est pas correctement mise à jour par la session d'intégration. En conséquence, l'assistant assert_redirected_to ne fonctionnera pas.

Aussi cette page a les mêmes informations: Rspec make sure we ended up at correct path

vous aurez donc besoin de vérifier que vous êtes maintenant sur cette URL, plutôt que le test que vous allez être redirigé vers elle.

10

Je ne suis pas sûr que cela peut être ce dont vous avez besoin, mais dans mes tests je préfère cette approche:

... 
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' est inutile, vous pouvez utiliser simplement 'current_path' puisque vous avez déjà déclaré' page' comme sujet – mitra

Questions connexes