Capybara'yı kullanarak sorgu dizesi ile geçerli yol nasıl elde edilir


144

/people?search=name Ben sadece current_pathdöndü capybara yöntemi kullanılırken sayfa url gibi bir şeydir /people.

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

Ama söyleyemedi

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

Nasıl geçebiliriz? Bunu yapmanın bir yolu var mı?


10
"/people?search=name" bir yol değil . "/people"bir yol
Andrei Botalov

Yanıtlar:


213

Bu cevabı, capybara'daki modern sözleşmeleri yansıtacak şekilde güncelledim. Bunun ideal olduğunu düşünüyorum, çünkü bu kabul edilen cevap ve bir çözüm ararken birçok insana neyin atıfta bulunduğu. Bununla birlikte, mevcut yolu kontrol etmenin doğru yolu has_current_path?, burada belgelendiği gibi Capybara tarafından sağlanan eşleştiriciyi kullanmaktır : Buraya Tıklayın

Örnek kullanım:

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

Belgelerde gördüğünüz gibi, diğer seçenekler de mevcuttur. Geçerli sayfa, /people?search=nameancak /peopleparametreden bağımsız olarak yalnızca sayfada olmasını önemsiyorsanız , only_pathseçeneği gönderebilirsiniz :

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

Ayrıca, URL'nin tamamını karşılaştırmak isterseniz:

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

Tom Walpole'a bu yöntemi işaret ettiği için teşekkür ederiz.


4
Muhtemelen bu sözdizimine çok yakında ihtiyacım olacak, eski bir uygulama için testler yazıyorum. Kullanmak current_path.should ==şimdilik çalışıyor (gerçi bir sondaki eğik çizgi bir dize olarak eklemeniz gerekir). Muhtemelen ihtiyaç duyacağım kod için şimdiden teşekkür ederim.
Tass

3
URI.parse(current_url).request_uridaha özlü. BakınızLasse Bunk'ın cevabı.
Richard Jones

Capybara 2.5 itibariyle, bu artık en iyi cevap değil. Aşağıdaki @ tom-walpole'un cevabına bakınız.
dkniffin

Asker kabul edilen cevabı değiştirmeyeceğinden, cevabı modern zamanları yansıtacak şekilde güncelledim. Bu, bir çözüm arayan ve ilk cevabı gören yeni kullanıcılar için daha yararlı olacaktır. Teşekkür için @OddityOverseer
nzifnab

1
Yeni Capybara sürümleri için ignore_query: truekullanınonly_path: true
Alexander

92

Tam URL'leri parametrelerle karşılaştırmak için _path yöntemini _url ile değiştirdim.

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

4
Ev sahibi kısımla nasıl başa çıktınız?
Chris Nicola

11
Ayrıca current_pathyeni Capybara versiyonlarında da kullanabilir ve şuna karşı eşleştirebilirsinizpeople_path(...)
Jason Stirk

Yol adını belirlemediğimde ... Sadece / kullanicilar / kayitlarim var ... o zaman nasil kullanmaliyim?
Gopal S Rathore

URL'nin html sayfasından farklı olması için bir oluşturma işleminde oluyorsa ne olur?
bigpotato

53

Bu soruyu modern zamanlar için güncellemeniz yeterli. Capybara 2.5+ kullanırken current_path'leri kontrol etmek için geçerli en iyi uygulama, yolu kontrol etmek için Capybaras bekleme davranışını kullanacak current_path eşleştiricisini kullanmaktır. Request_uri'ye (yol ve sorgu dizesi) karşı kontrol etmek istiyorsanız

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

Yalnızca yol kısmı isteniyorsa (sorgu dizesini yok sayılıyor)

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

Tam URL'yi eşleştirmek istiyorsanız

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

eşleştirici == ile karşılaştırılan bir dize veya eşleşecek bir normal ifade alır

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

4
bu modern zamanlarda bu şekilde işaretlenmiş olmalıdır cevap. Bu çok belirsiz zamanlama sorunlarını güvence altına alacak, teşekkürler!
Axe

1
@Vanuan rspec shouldsözdizimini kullanımdan kaldırıyor . expect().toİleriye dönük özelliklerinizde kullanmak için çaba göstermelisiniz .
nzifnab

1
only_path: trueşimdiignore_query: true
srghma

18

Bir cevabın seçildiğini biliyorum, ama sadece alternatif bir çözüm vermek istedim. Yani:

Rails'te olduğu gibi yolu ve sorgu dizesini almak için request.fullpathşunları yapabilirsiniz:

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

Ayrıca test sınıfınızda (böyle ActionDispatch::IntegrationTest) yardımcı bir yöntem de yapabilirsiniz (yaptığım budur):

def current_fullpath
  URI.parse(current_url).request_uri
end

Bu yardımcı olur umarım.


1

EDIT: Tinynumberes belirtildiği gibi, bu bağlantı noktası numaralı URL'ler için başarısız. Başka birinin aynı parlak fikre sahip olması durumunda burada tutmak.

current_url[current_host.size..-1]

Golfler de aynı şekilde (35 karakter) URI.parse(current_url).request_uri, ancak potansiyel olarak daha hızlıdır, çünkü açık bir URI ayrıştırma yoktur.

Bunu Capybara'ya şu adresten eklemek için bir istekte bulundum: https://github.com/jnicklas/capybara/pull/1405


current_urlBağlantı noktası numarası içeriyorsa bu çalışmaz . Örneğin, belirli bir current_urlbölgesinin http://foo.com:8888/some/path, current_url[current_host.size..-1]eşit olacaktır :8888/some/path. Ayrıca, perde arkasında, @nzifnab'ın kabul edilen cevapta önerdiği mantıkla current_hostaynı şey URI.parseyapılır.
Tinynumbers
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.