Cách nhận đường dẫn hiện tại bằng chuỗi truy vấn bằng Capybara


144

Url trang là một cái gì đó giống như /people?search=name trong khi tôi sử dụng current_pathphương pháp capybara, nó /peoplechỉ trả về .

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

Nhưng nó không nói

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

Làm thế nào chúng ta có thể làm cho nó vượt qua? Có cách nào để làm điều này?


10
"/people?search=name" không phải là một con đường . "/people"là một con đường
Andrei Botalov

Câu trả lời:


212

Tôi đã cập nhật câu trả lời này để phản ánh các quy ước hiện đại trong capybara. Tôi nghĩ rằng đây là lý tưởng vì đây là câu trả lời được chấp nhận và những gì nhiều người đang được đề cập khi tìm kiếm một giải pháp. Như đã nói, cách chính xác để kiểm tra đường dẫn hiện tại là sử dụng công cụ has_current_path?đối sánh do Capybara cung cấp, như được ghi lại ở đây: Bấm vào đây

Ví dụ sử dụng:

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

Như bạn có thể thấy trong tài liệu, các tùy chọn khác có sẵn. Nếu trang hiện tại là /people?search=namenhưng bạn chỉ quan tâm rằng nó trên /peopletrang bất kể thông số, bạn có thể gửi only_pathtùy chọn:

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

Ngoài ra, nếu bạn muốn so sánh toàn bộ URL:

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

Tín dụng cho Tom Walpole để chỉ ra phương pháp này.


4
Có lẽ tôi sẽ cần cú pháp này rất sớm, tôi đang viết bài kiểm tra cho một ứng dụng cũ. current_path.should ==Hiện tại, việc sử dụng đang hoạt động (mặc dù tôi cần thêm dấu gạch chéo phía trước dưới dạng chuỗi). Tôi cảm ơn bạn trước về mã tôi có thể sẽ cần.
Tass

3
URI.parse(current_url).request_uringắn gọn hơn Xem câu trả lời của @Lasse Bunk.
Richard Jones

Kể từ Capybara 2.5, đây không còn là câu trả lời hay nhất. Xem câu trả lời của @ tom-walpole bên dưới.
dkniffin

Vì người hỏi không thể thay đổi câu trả lời được chấp nhận, tôi đã cập nhật câu trả lời để phản ánh thời hiện đại. Điều này sẽ hữu ích hơn cho người dùng mới đang tìm kiếm một giải pháp và xem câu trả lời đầu tiên. Cảm ơn @OddityOverseer đã chỉ ra
nzifnab

1
Đối với các phiên bản Capybara mới, hãy sử dụng ignore_query: truethay vìonly_path: true
Alexander

92

Tôi đã thay thế phương thức _path bằng _url để đạt được việc so sánh các url đầy đủ với các tham số.

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

4
Làm thế nào bạn đối phó với các phần chủ?
Chris Nicola

11
Bạn cũng có thể sử dụng current_pathtrong các phiên bản mới hơn của Capybara và kết hợp nó vớipeople_path(...)
Jason Stirk

Khi tôi không có tên đường dẫn ... Tôi chỉ có / người dùng / đăng ký ... thì tôi nên sử dụng nó như thế nào?
Gopal S Rathore

Điều gì xảy ra nếu nó xảy ra trên một kết xuất, để URL khác với trang html?
bigpotato

52

Chỉ cần cập nhật câu hỏi này cho thời hiện đại. Cách tốt nhất hiện tại để kiểm tra current_paths khi sử dụng Capybara 2.5+ là sử dụng trình so khớp current_path, sẽ sử dụng hành vi chờ của Capybaras để kiểm tra đường dẫn. Nếu muốn kiểm tra dựa trên request_uri (đường dẫn và chuỗi truy vấn)

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

Nếu chỉ muốn phần đường dẫn (bỏ qua chuỗi truy vấn)

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

Nếu muốn khớp với url đầy đủ

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

công cụ đối sánh sẽ lấy một chuỗi được so sánh với == hoặc regex để khớp với

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

4
trong những thời hiện đại này nên được đánh dấu là các câu trả lời. Điều này sẽ an toàn rất nhiều vấn đề thời gian mơ hồ, cảm ơn!
Axe

1
@Vanuan rspec đã phản đối shouldcú pháp. Bạn nên cố gắng sử dụng expect().totrong thông số kỹ thuật của bạn trong tương lai.
nzifnab

1
only_path: truebây giờignore_query: true
srghma

18

Tôi biết một câu trả lời đã được chọn, nhưng tôi chỉ muốn đưa ra một giải pháp thay thế. Vì thế:

Để có được đường dẫn và chuỗi truy vấn, như request.fullpathtrong Rails, bạn có thể làm:

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

Bạn cũng có thể thực hiện một phương thức trợ giúp trong lớp thử nghiệm của mình (như ActionDispatch::IntegrationTest) như thế này (đó là những gì tôi đã làm):

def current_fullpath
  URI.parse(current_url).request_uri
end

Hi vọng điêu nay co ich.


1

EDIT: như Tinynumberes đã đề cập, điều này không thành công đối với các URL có số cổng. Giữ nó ở đây trong trường hợp bất cứ ai khác có cùng ý tưởng tuyệt vời.

current_url[current_host.size..-1]

golf cũng chính xác (35 ký tự) URI.parse(current_url).request_uri, nhưng có khả năng nhanh hơn vì không có phân tích cú pháp URI rõ ràng liên quan.

Tôi đã thực hiện một yêu cầu kéo để thêm điều này vào Capybara tại: https://github.com/jnicklas/caccobara/pull/1405


Điều này không hoạt động nếu current_urlcó thể chứa một số cổng. Ví dụ được đưa ra một current_urlsố http://foo.com:8888/some/path, current_url[current_host.size..-1]sẽ tương đương :8888/some/path. Ngoài ra, đằng sau hậu trường current_hostcũng có loại URI.parselogic tương tự mà @nzifnab đề xuất trong câu trả lời được chấp nhận.
Tinynumbers
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.