2011-03-08 55 views
130

頁面url是類似/people?search=name 而我使用current_path水豚的方法它只返回/people如何使用查詢字符串獲得當前路徑使用水豚

current_path.should == people_path(:search => 'name') 

但它沒有說

expected: "/people?search=name" 
got: "/people" 

我們怎樣才能把它傳遞?有沒有辦法做到這一點?

+10

'「/ people?search = name」'[不是路徑](http://en.wikipedia.org/wiki/URI_scheme#Generic_syntax)。 '「/ people」'是一條路徑 – 2013-05-10 10:52:43

回答

186

我已更新此答案,以反映水豚的現代習俗。我認爲這是理想的,因爲這是可以接受的答案,並且在尋找解決方案時會提到很多人。隨着中說,來檢查當前路徑正確的方法是使用由水豚提供的has_current_path?匹配,如記錄在這裏:Click Here

用法示例:

expect(page).to have_current_path(people_path(search: 'name')) 

正如你可以在文檔中看到,其他選項可用。如果當前頁面爲/people?search=name,但你只關心它的/people頁面上,無論帕拉姆的,你可以發送only_path選項:

expect(page).to have_current_path(people_path, only_path: true) 

此外,如果你想比較完整的URL:

expect(page).to have_current_path(people_url, url: true) 

感謝湯姆沃爾波爾指出這種方法。

+0

正是我需要的。謝謝@nzifnab。 – kriysna 2011-03-09 11:15:52

+4

我可能很快就需要這個語法,我正在爲遺留應用程序編寫測試。使用'current_path.should =='現在工作(儘管我需要添加一個尾隨的正斜槓作爲字符串)。我很感謝您提供我可能需要的代碼。 – Tass 2011-08-19 21:16:15

+0

current_url,沒有看到。謝謝! – thatmiddleway 2013-04-16 18:25:14

90

我用_url替換_path方法來實現比較完整的url和參數。

current_url.should == people_url(:search => 'name') 
+4

你是如何處理主機部分的? – 2012-04-11 22:58:10

+0

這幫助了我很多,比接受的答案更容易實施。謝謝! – kikito 2012-04-25 07:39:49

+1

這是正確的方法 – Rimian 2012-07-06 04:48:47

16

我知道一個答案已被選中,但我只是想給一個替代解決方案。所以:

爲了獲取路徑和查詢字符串,就像在Rails的request.fullpath,你可以這樣做:

URI.parse(current_url).request_uri.should == people_path(:search => 'name') 

您也可以在您的測試類的輔助方法(如ActionDispatch::IntegrationTest)這樣的(這是什麼我做到了):

def current_fullpath 
    URI.parse(current_url).request_uri 
end 

希望這會有所幫助。

0

編輯:正如Tinynumberes提到的,這對具有端口號的URL失敗。保持在這裏以防其他人有同樣的好主意。

current_url[current_host.size..-1] 

高爾夫的準確以及(35個字符)作爲URI.parse(current_url).request_uri,但是可能更快,因爲有解析所涉及沒有明確的URI。

我已經做了拉請求,這在添加到水豚:https://github.com/jnicklas/capybara/pull/1405

+0

如果'current_url'可能包含端口號,則這不起作用。例如。給定'http_foo.com:8888/some/path'的'current_url','current_url [current_host.size ..- 1]'等於':8888/some/path'。 此外,''current_host'後面的場景與@nzifnab在接受的答案中推薦的'URI.parse'邏輯類型相同。 – Tinynumbers 2015-01-29 14:36:42

44

剛剛更新了近代這個問題。當使用Capybara 2.5+時檢查current_paths的最佳做法是使用current_path匹配器,它將使用Capybaras等待行爲來檢查路徑。如果想檢查對REQUEST_URI(路徑和查詢字符串)

expect(page).to have_current_path(people_path(:search => 'name')) 

如果只是希望路徑部分(忽略查詢字符串)

expect(page).to have_current_path(people_path, only_path: true) 

如果想匹配的完整URL

expect(page).to have_current_path(people_url, url: true) 

匹配器會將字符串與==或正則表達式進行比較以匹配

expect(page).to have_current_path(/search=name/) 
+1

「應該」是什麼?將'page.should'工作? – Vanuan 2015-12-04 14:49:13

+4

在這些現代時代,這應該被標記爲*答案。這將安全很多模糊的時間問題,謝謝! – Axe 2016-03-06 12:12:39

+1

@Vanuan rspec一直不贊成使用'should'語法。你應該努力在你的規格中繼續使用'expect()。到'。 – nzifnab 2016-09-08 17:17:23