Answers:
我已经更新了此答案,以反映水豚的现代习俗。我认为这是理想的选择,因为这是公认的答案,并且在寻找解决方案时会提及许多人。话虽如此,检查当前路径的正确方法是使用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指出了这种方法。
current_path.should ==
现在使用正在工作(尽管我需要在字符串中添加尾随正斜杠)。在此先感谢您提供可能需要的代码。
URI.parse(current_url).request_uri
更简洁。请参阅@Lasse Bunk的答案。
ignore_query: true
,而不是only_path: true
我用_url替换了_path方法,以实现将完整的url与参数进行比较。
current_url.should == people_url(:search => 'name')
current_path
在新版本的水豚中使用和匹配people_path(...)
只是在现代更新这个问题。当前在使用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/)
should
语法。您应该努力expect().to
在以后的规格中使用。
only_path: true
现在ignore_query: true
我知道已经选择了一个答案,但是我只是想提供一个替代解决方案。所以:
要获取路径和查询字符串,例如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
希望这可以帮助。
编辑:如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_url
的http://foo.com:8888/some/path
,current_url[current_host.size..-1]
将等于:8888/some/path
。同样,幕后的current_host
行为与URI.parse
@nzifnab在接受的答案中建议的逻辑相同。
"/people?search=name"
不是一条路。"/people"
是一条路