2012-06-27 4 views
31

Właśnie dowiedziałem się, jak fajne są RSpec i Cabybara, a teraz pracuję nad nimi, aby nauczyć się pisania aktualnego testu.Przekierowanie testowe z RSpec i Capybara (Rails)

Próbuję sprawdzić, czy po kliknięciu łącza istnieje przekierowanie do określonej strony. Poniżej jest scenariusz

 

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 

test nie powiedzie się komunikat błędu jak poniżej

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

Proszę zasugerować mi, w jaki sposób powinienem testować przekierowanie i co robię źle?

Odpowiedz

68

Spróbuj current_path.should == "/projects/show"

Kapibara realizuje również current_url sposób w pełni kwalifikowaną URL.

Więcej informacji pod numerem docs.

+3

może lepiej używać' projects_path'? A może użyć notacji 'expect' podczas gdy jesteś na niej – SuckerForMayhem

-2

Trzeba korzystać z trasy, coś jak:

assert_redirected_to projects_path 

zamiast

assert_redirected_to "/projects/show" 
+0

Gdy używam jak 'assert_redirected_to projects_path' pokazuje jak' niezdefiniowanej zmiennej lokalnej lub metoda „' projects_path dla # ' – balanv

+0

potrzebujesz project_show_path w tym przypadku –

4

Z Devise wiki:

w szynach gdy przekierowania aplikacji zębowe (tak jak Warden/Devise przekierowuje cię na stronę logowania), odpowiedź nie jest poprawnie aktualizowana przez sesję integracji. W związku z tym pomocnik assert_redirected_to nie będzie działać.

Również ten zawiera te same informacje: Rspec make sure we ended up at correct path

więc trzeba testować, że jesteś teraz pod tym adresem URL, zamiast testu, który Zostaniesz przekierowany do niego.

10

Nie jestem pewien, że to może być to, co trzeba, ale w moich testach wolę takiego podejścia:

... 
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' jest niepotrzebne, możesz użyć tylko 'current_path' ponieważ już zadeklarowałeś' page' jako temat – mitra