如何使用水豚查询字符串得到当前路径

页面 URL 类似于 /people?search=name 而我使用水豚的 current_path方法它只返回 /people

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

但它没有说

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

我们怎么才能通过? 有什么办法吗?

85544 次浏览

我更新了这个答案以反映水豚的现代习俗。我认为这是理想的,因为这是公认的答案,也是许多人在寻找解决方案时所提到的。也就是说,检查当前路径的正确方法是使用 Capybara 提供的 has_current_path?匹配器,如下所示: 点击这里

示例用法:

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)

此外,如果你想比较整个网址:

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

感谢汤姆 · 沃波尔指出了这种方法。

我将 _ path 方法替换为 _ url,以实现将完整 url 与参数进行比较。

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

我知道一个答案已经被选中了,但我只是想给出一个替代的解决方案。所以:

要获取路径和 query 字符串,就像 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

希望这个能帮上忙。

编辑: 正如 Tinynumberes 提到的,这对于带端口号的 URL 失败。放在这里,以防其他人也有同样的好主意。

current_url[current_host.size..-1]

Golfs 与 URI.parse(current_url).request_uri完全一样(35个字符) ,但可能更快,因为没有涉及显式的 URI 解析。

我已经提出了一个拉请求,以添加到水豚: https://github.com/jnicklas/capybara/pull/1405

只是为了现代更新这个问题。当前在使用 Capybara 2.5 + 时检查 current _ path 的最佳实践是使用 current _ path 匹配器,它将使用 Capybara 等待行为来检查路径。如果想要检查 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/)

注意作者提到的 在这个评论中current_url的使用可能导致片状测试。