Cara mendapatkan jalur saat ini dengan string kueri menggunakan Capybara


144

URL halaman adalah sesuatu seperti /people?search=name ketika saya menggunakan current_pathmetode capybara /peoplehanya dikembalikan .

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

Tapi itu gagal dikatakan

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

Bagaimana kita bisa melewatinya? Apakah ada cara untuk melakukan ini?


10
"/people?search=name" bukan jalan . "/people"is a path
Andrei Botalov

Jawaban:


212

Saya telah memperbarui jawaban ini untuk mencerminkan konvensi modern di capybara. Saya pikir ini ideal karena ini adalah jawaban yang diterima, dan apa yang dirujuk oleh banyak orang ketika mencari solusi. Dengan itu, cara yang benar untuk memeriksa jalur saat ini adalah dengan menggunakan has_current_path?pencocokan yang disediakan oleh Capybara, seperti yang didokumentasikan di sini: Klik Di Sini

Contoh penggunaan:

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

Seperti yang dapat Anda lihat di dokumentasi, opsi lain tersedia. Jika halaman saat ini adalah /people?search=nametetapi Anda hanya peduli bahwa itu ada di /peoplehalaman terlepas dari param, Anda dapat mengirim only_pathopsi:

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

Selain itu, jika Anda ingin membandingkan seluruh URL:

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

Penghargaan untuk Tom Walpole karena menunjukkan metode ini.


4
Saya mungkin akan membutuhkan sintaks ini segera, saya sedang menulis tes untuk aplikasi warisan. Menggunakan current_path.should ==berfungsi untuk saat ini (meskipun saya perlu menambahkan garis miring ke depan sebagai string). Saya berterima kasih sebelumnya untuk kode yang mungkin akan saya butuhkan.
Tass

3
URI.parse(current_url).request_urilebih ringkas. Lihat jawaban @Lasse Bunk.
Richard Jones

Pada Capybara 2.5, ini bukan lagi jawaban terbaik. Lihat jawaban @ tom-walpole di bawah ini.
dkniffin

Karena penanya tidak mungkin mengubah jawaban yang diterima, saya telah memperbarui jawaban untuk mencerminkan zaman modern. Ini seharusnya lebih bermanfaat bagi pengguna baru yang mencari solusi dan melihat jawaban pertama. Terima kasih @OddityOverseer karena menunjukkannya
nzifnab

1
Untuk versi Capybara baru gunakan ignore_query: truealih-alihonly_path: true
Alexander

92

Saya mengganti metode _path dengan _url untuk mencapai membandingkan url lengkap dengan parameter.

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

4
Bagaimana Anda menangani bagian host?
Chris Nicola

11
Anda juga dapat menggunakan current_pathCapybara dalam versi yang lebih baru dan mencocokkannya denganpeople_path(...)
Jason Stirk

Ketika saya tidak memiliki nama path ... Saya hanya memiliki / pengguna / daftar ... lalu bagaimana saya harus menggunakannya?
Gopal S Rathore

Bagaimana jika itu terjadi pada render, sehingga URL berbeda dari halaman html?
bigpotato

52

Hanya memperbarui pertanyaan ini untuk zaman modern. Praktik terbaik saat ini untuk memeriksa current_paths saat menggunakan Capybara 2.5+ adalah dengan menggunakan pencocokan current_path, yang akan menggunakan perilaku menunggu Capybaras untuk memeriksa lintasan. Jika ingin memeriksa terhadap request_uri (jalur dan string kueri)

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

Jika hanya menginginkan bagian jalur (mengabaikan string kueri)

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

Jika ingin mencocokkan url lengkap

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

pencocokan akan mengambil string yang dibandingkan dengan == atau regex untuk dicocokkan

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

4
di zaman modern ini harus ditandai sebagai yang jawabannya. Ini akan mengamankan banyak masalah waktu yang tidak jelas, terima kasih!
Kapak

1
@Vanuan rspec telah mencabut shouldsintaksisnya. Anda harus berusaha untuk menggunakan expect().tospesifikasi Anda ke depan.
nzifnab

1
only_path: truesekarangignore_query: true
srghma

18

Saya tahu jawaban telah dipilih, tetapi saya hanya ingin memberikan solusi alternatif. Begitu:

Untuk mendapatkan path dan querystring, seperti request.fullpathdi Rails, Anda dapat melakukan:

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

Anda juga dapat melakukan metode pembantu di kelas ujian Anda (seperti ActionDispatch::IntegrationTest) seperti ini (yang saya lakukan):

def current_fullpath
  URI.parse(current_url).request_uri
end

Semoga ini membantu.


1

EDIT: seperti yang disebutkan Tinynumberes, ini gagal untuk URL dengan nomor port. Menyimpannya di sini kalau-kalau ada orang lain yang memiliki ide cemerlang yang sama.

current_url[current_host.size..-1]

golf juga (35 karakter) URI.parse(current_url).request_uri, tetapi berpotensi lebih cepat karena tidak ada penguraian URI eksplisit.

Saya telah membuat permintaan tarik untuk menambahkan ini ke Capybara di: https://github.com/jnicklas/capybara/pull/1405


Ini tidak berfungsi jika current_urlmungkin berisi nomor port. Misalnya diberi current_urldari http://foo.com:8888/some/path, current_url[current_host.size..-1]akan sama :8888/some/path. Selain itu, di balik layar current_hostmelakukan URI.parselogika yang sama seperti yang direkomendasikan oleh @nzifnab dalam jawaban yang diterima.
Tinynumbers
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.