Yanıtlar:
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.
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.
URI.parse(current_url).request_uridaha özlü. BakınızLasse Bunk'ın cevabı.
ignore_query: truekullanınonly_path: true
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')
current_pathyeni Capybara versiyonlarında da kullanabilir ve şuna karşı eşleştirebilirsinizpeople_path(...)
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/)
shouldsözdizimini kullanımdan kaldırıyor . expect().toİleriye dönük özelliklerinizde kullanmak için çaba göstermelisiniz .
only_path: trueşimdiignore_query: true
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.
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.
"/people?search=name"bir yol değil ."/people"bir yol