2012-06-27 87 views
31

我剛剛已經瞭解了RSpec和Cabybara是多麼的酷,現在正在努力學習編寫實際測試。使用RSpec和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 

測試失敗,失敗消息像下面

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

請給我建議,我應該如何測試的重定向和我到底做錯了什麼?

回答

68

嘗試current_path.should == "/projects/show"

水豚也實現了完全合格的URL current_url方法。

更多的信息在docs

+3

可能更好地使用'projects_path'?也許在你使用'expect'時使用'not''' – SuckerForMayhem

-2

您需要使用的路線,是這樣的:

assert_redirected_to projects_path 

而不是

assert_redirected_to "/projects/show" 
+0

當我使用像'assert_redirected_to projects_path'它顯示了像'未定義的局部變量或方法'projects_path」對於#' – balanv

+0

您需要在這種情況下projects_show_path –

4

Devise wiki

在Rails當機架應用重定向(就像監護人/設計人員將您重定向到登錄頁面),集成會話沒有正確更新響應。因此,幫助器assert_redirected_to將不起作用。

而且這個頁面有相同的信息:Rspec make sure we ended up at correct path

所以你需要測試,您現在訪問的URL,而不是你將被重定向到它的測試。

10

林不知道,這可能是你所需要的,但在我的測試中,我更喜歡這樣的做法:

... 
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'是不必要的,你可以只使用'current_path',因爲你已經聲明'page'是一個主題 – mitra

相關問題