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?

kriysna
sumber
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.

nzifnab
sumber
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')
Robert Starsi
sumber
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/)
Thomas Walpole
sumber
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.

Lasse Bunk
sumber
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

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
sumber
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