8

Tüm yığınımı Rails 3.0 tabanlı bir projeden 3.1'e yükselttim. Özelliklerim var ama özelliklerim şimdi biraz seçici. Capybara: Öğelerin Sayısı Verilen Bir Değer Nasıl Verilir

Then /^I should see (\d+) menu item(?:s)? within "([^"]*)"$/ do |count, selector| 
    page.find(:css, selector, :count => count.to_i) 
end 

Ve özelliği kendisinde

, ben koymak olabilir:

Then I should see 5 menu items within "tr#menu_item_row" 

alıyorum mesajdır:

Then I should see 5 menu items within "tr#menu_item_row"          # features/step_definitions/admin_menu_steps.rb:1 
    Ambiguous match, found 5 elements matching css "tr#menu_item_row" (Capybara::Ambiguous) 
    ./features/step_definitions/admin_menu_steps.rb:2:in `/^I should see (\d+) menu item(?:s)? within "([^"]*)"$/' 
    features/admin_menu.feature:30:in `Then I should see 5 menu items within "tr#menu_item_row"' 

Bildiğim kadarıyla şu anda yaşadığım sorun bu adımdır anlatabildiğim gibi, 5 eleman aslında bulunan 5 ile eşleşiyor. Bu kodu yanlış mı yazdım yoksa önemli bir şey mi değişti? Teşekkürler!

cevap

14

Eğer 5 elementi kontrol etmek istiyorsanız, Capybara 2.0'dan bu yana #find'u varsayılan olarak kullanmamalısınız, bu metot her zaman bir elemandan daha fazla veya daha az buluyorsa bir istisna atar. Bu kasıtlı ve (inanıyorum) iyi bir değişim oldu. Eğer Capybara eğer bir özel durum istediğiniz durumların çoğunda olduğu gibi @fontno tarafından tavsiye edildiği

expect(page).to have_css(selector, count: count.to_i) 

Ben to set match to prefer_exact önermiyoruz:

uygun bir yöntem RSpec eşleştirici olan 5 element mevcut olduğunu iddia etmek find, birden fazla öğe bulur.

2

Evet, bu 1.x ve 2.x sürümleri arasında bir değişiklik. capybara upgrade guide ve bu blog post'daki tüm değişikliklere bakabilirsiniz.

find yöntemi artık birden fazla öğe bulunduğunda ambiguous match hatasını yükseltir. Yalnızca birkaç örnek varsa bu

Then /^I should see (\d+) menu item(?:s)? within "([^"]*)"$/ do |count, selector| 
    page.find(:css, selector, :count => count.to_i, match: prefer_exact) 
end 

gibi bir şey yapabileceğini ya da bunun gibi birçok örnek varsa, geriye uyumlu olacak bu

Capybara.configure do |config| 
    config.match = :prefer_exact 
    config.ignore_hidden_elements = false 
end 

Sen may gibi bir şey Kapibara yapılandırmasını değiştirebilir Çalışmak için bunu değiştirmek zorunda ama bu genel bir fikir. Yukarıda bahsettiğim bağlantılara bakın, hepsi burada. Umarım bu doğru yönde ayarlar Umut

+0

': Eğer bağlı ve birçok insan onların kod 1.x için yazılmış olan onlar geriye uyumlu olacak lüzum söyledi olarak Capybara 2.1'de eklenmiştir blog yazısında görebileceğiniz gibi prefer_exact' kötü bir uygulama olarak kabul edilebilir . Bunu kullanmak için tavsiye etmek kötü bir fikir olduğunu düşünüyorum. –

+0

bu yüzden başvurulan ve makaleye bağlandığım için aşağı oylamayı hak ettim? Sadece soruyu neden böyle olduğunu ve bunun hakkında ne yapılabileceğini anlatıyordum. Soruyu, bu özelliği güncellememeleri gerektiğini ve sadece bu şekilde yapmamasını söylemedim. Sadece bir soru "bir şey değişti mi?" – fontno

+0

Upvoting, çünkü dikkatimi 'match' ayarları arasındaki farka odakladı. –

İlgili konular