如何使用Capybara使用查询字符串获取当前路径


144

页面URL就像/people?search=name 我使用current_path水豚的方法时一样,它/people仅返回。

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

但是它没有说

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

我们如何使它通过?有什么办法可以做到这一点?


10
"/people?search=name" 不是一条路"/people"是一条路
Andrei Botalov

Answers:


212

我已经更新了此答案,以反映水豚的现代习俗。我认为这是理想的选择,因为这是公认的答案,并且在寻找解决方案时会提及许多人。话虽如此,检查当前路径的正确方法是使用has_current_path?Capybara提供的匹配器,如此处所述:单击此处

用法示例:

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)

感谢Tom Walpole指出了这种方法。


4
我可能很快就会需要这种语法,我正在为旧版应用程序编写测试。current_path.should ==现在使用正在工作(尽管我需要在字符串中添加尾随正斜杠)。在此先感谢您提供可能需要的代码。
塔斯(Tass)

3
URI.parse(current_url).request_uri更简洁。请参阅@Lasse Bunk的答案。
理查德·琼斯

从Capybara 2.5开始,这不再是最佳答案。请参阅下面的@ tom-walpole答案。
dkniffin

由于申请者不太可能更改接受的答案,因此我更新了答案以反映现代情况。对于寻求解决方案并看到第一个答案的新用户来说,这应该更有用。感谢@OddityOverseer指出这一点
nzifnab

1
对于新版本的水豚用ignore_query: true,而不是only_path: true
亚历山大

92

我用_url替换了_path方法,以实现将完整的url与参数进行比较。

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

4
您是如何处理主机部分的?
克里斯·尼古拉

11
您还可以current_path在新版本的水豚中使用和匹配people_path(...)
Jason Stirk

当我没有命名路径时...我只有/ users / register ...那么我应该如何使用它?
Gopal S Rathore

如果它发生在渲染器上,因此URL与html页面不同怎么办?
bigpotato 2014年

52

只是在现代更新这个问题。当前在使用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) # Capybara < 2.16
expect(page).to have_current_path(people_path, ignore_query: true) # Capybara >= 2.16

如果要匹配完整的URL

expect(page).to have_current_path(people_url, url: true) # Capybara < 2.16
expect(page).to have_current_path(people_url) # Capybara >= 2.16

匹配器将采用与==或正则表达式进行比较的字符串

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

4
在这些近代本应该注明答案。这将解决许多模糊的计时问题,谢谢!
Ax

1
@Vanuan rspec已弃用该should语法。您应该努力expect().to在以后的规格中使用。
nzifnab

1
only_path: true现在ignore_query: true
srghma

18

我知道已经选择了一个答案,但是我只是想提供一个替代解决方案。所以:

要获取路径和查询字符串,例如request.fullpath在Rails中,您可以执行以下操作:

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

您也可以ActionDispatch::IntegrationTest像这样(在我的工作中)在测试类中(例如)做一个辅助方法:

def current_fullpath
  URI.parse(current_url).request_uri
end

希望这可以帮助。


1

编辑:如Tinynumberes所述,这对于带有端口号的URL失败。保留在这里,以防其他人有相同的绝妙想法。

current_url[current_host.size..-1]

与完全一样(35个字符)打高尔夫球URI.parse(current_url).request_uri,但由于没有显式的URI解析,因此可能更快。

我已经发出拉请求,将其添加到Capybara中:https : //github.com/jnicklas/capybara/pull/1405


如果current_url可能包含端口号,则此方法不起作用。例如,给出current_urlhttp://foo.com:8888/some/pathcurrent_url[current_host.size..-1]将等于:8888/some/path。同样,幕后的current_host行为与URI.parse@nzifnab在接受的答案中建议的逻辑相同。
Tinynumbers
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.