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=name
ancak /people
parametreden bağımsız olarak yalnızca sayfada olmasını önemsiyorsanız , only_path
seç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_uri
daha özlü. BakınızLasse Bunk'ın cevabı.
ignore_query: true
kullanı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_path
yeni 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/)
should
sö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_url
Bağlantı noktası numarası içeriyorsa bu çalışmaz . Örneğin, belirli bir current_url
bö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_host
aynı şey URI.parse
yapılır.
"/people?search=name"
bir yol değil ."/people"
bir yol