Capybara'yı doğru hata mesajı ile kullanarak eleman sayısı nasıl belirlenir?


87

Capybara'da bunun gibi bir şey yapabileceğinizi biliyorum:

page.should have_css("ol li", :count => 2)

Bununla birlikte, sayfanın örneğin yalnızca bir eşleşen öğeye sahip olduğunu varsayarsak, hata çok açıklayıcı değildir:

  1) initial page load shows greetings
 Failure/Error: page.should have_css("ol li", :count => 2)
 expected css "ol li" to return something

Bu oldukça belirsiz hata mesajı yerine, iddiayı, hata çıktısının 'ol li' ile eşleşirken, beklenen: 2, bulunan: 1 'gibi bir şey olacağı şekilde yazmanın bir yolu var mı? Açıkçası, böyle bir davranış için kendime özel bir mantık oluşturabilirim - bunu 'kutudan çıkar çıkmaz' yapmanın bir yolu var mı diye soruyorum.

Değeri ne olursa olsun, Selenium sürücüsü ve RSpec kullanıyorum.


Sadece insanların bildiği gibi, "page.should have_css (" ol li ",: count => 2)" capybara'da uygulanmıştır. Kapsamlar için oldukça kullanışlı olduğunu düşünüyorum: ("ol.users-list") do page.should have_css ('li',: count => 3) end
rafaelkin

@rafaelkin, sadece açıklığa kavuşturmak için: capybara artık öğe sayısındaki uyumsuzluğu daha ayrıntılı olarak rapor ediyor mu? Bir süredir capybara'yı takip etmedim, ancak o zamanlar soruyu sorduğumda sorun, hata mesajının biçimiyle ilgiliydi, bu page.should have_css("ol li", :count => 2)zaten uygulanmamıştı.
merryprankster

millet, şu anda kabul edilen cevabın (= kendi cevabım) artık en iyisi olmadığını, ancak önerilen çözümlerden hangisinin en iyisi olduğunu değerlendirmek için zamanım (artık Ruby ile çalışmıyorum) gibi bir his var. Kabul edilen yanıtı Richard'ınkine değiştireceğim çünkü orijinal sorunu ele alan iddianın çıktısını içeriyor.
merryprankster

Yanıtlar:



22

Kutudan çıkar çıkmaz destek yok gibi göründüğü gibi, bu özel eşleştiriciyi yazdım:

RSpec::Matchers.define :match_exactly do |expected_match_count, selector|
    match do |context|
        matching = context.all(selector)
        @matched = matching.size
        @matched == expected_match_count
    end

    failure_message_for_should do
        "expected '#{selector}' to match exactly #{expected_match_count} elements, but matched #{@matched}"
    end

    failure_message_for_should_not do
        "expected '#{selector}' to NOT match exactly #{expected_match_count} elements, but it did"
    end
end

Şimdi, aşağıdaki gibi şeyler yapabilirsiniz:

describe "initial page load", :type => :request do
    it "has 12 inputs" do
        visit "/"
        page.should match_exactly(12, "input")
    end
end

ve aşağıdaki gibi çıktılar alın:

  1) initial page load has 12 inputs
     Failure/Error: page.should match_exactly(12, "input")
       expected 'input' to match exactly 12 elements, but matched 13

Şimdilik hile yapıyor, Capybara'nın bu bölümünü yapmaya çalışacağım.


Görünüşe göre bunu Capybara'da düzeltmek kolay değil: github.com/jnicklas/capybara/issues/331
merryprankster

14

Aşağıdakilerin daha basit olduğunu, oldukça net çıktılar sağladığını ve özel bir eşleştirici ihtiyacını ortadan kaldırdığını düşünüyorum.

page.all("ol li").count.should eql(2)

Bu daha sonra şu hatayı yazdırır:

      expected: 2
       got: 3

  (compared using eql?)
  (RSpec::Expectations::ExpectationNotMetError)

9
Bu, örneğin bekleyen ajax istekleri varken, beklentinin gerçekleşmesini beklemez.
Clemens Helm

9

Düzenleme: @ThomasWalpole tarafından belirtildiği gibi,all Capybara'nın beklemesini / yeniden devre dışı bırakır, bu nedenle @pandaPower'ın yukarıdaki cevabı çok daha iyidir.

Buna ne dersin?

  within('ol') do
    expect( all('.opportunity_title_wrap').count ).to eq(2)
  end

2
Bu, Capibaras'ın bekleme / yeniden denemesini tamamen ortadan kaldırır ve asla önerilen bir çözüm olmamalıdır.
Thomas Walpole

@ThomasWalpole Neden bahsettiğinden emin değilim. Başka bir elemanın içindeki bir unsuru aramak, Capybara'daki beklemeye / yeniden denemeye nasıl bir şekilde dokunur?
Constant Meiring

2
@ConstantMeiring Bu değil, beklemeyi / yeniden denemeyi devre dışı bırakan sonuçları withinçağırıyor . Sonuçlarını çağırarak (boş bir "dizi" geçerli bir dönüştür) bir tam sayıya dönüştürür ve karşılaştırırsınız. Bu karşılaştırma başarısız olursa beklenti başarısız olur. Bunun yerine sayma seçeneğini Capybara'nın eşleştiricilerinden birine iletirseniz, kapibara, sayı seçeneği eşleşene kadar (veya Capybara.default_max_wait_time sona erene) belirtilen seçiciyi bulmayı bekleyecek / yeniden bulmaya çalışacaktır. .countallcountall
Thomas Walpole

4

Capybara tarafından önerilen mevcut (9/2/2013) en iyi uygulama şudur ( kaynak ):

page.assert_selector('p#foo', :count => 4)


-4

@PandaPower'ın cevabı çok iyi, ancak sözdizimi benim için biraz farklıydı:

expect(page).to have_selector('.views-row', :count => 30)

5
Hash roketlerinin kullanılması "farklı sözdizimi" olarak nitelendirilmez.
2014

2
Ruby geliştirici değilim ve iki sözdiziminin eşdeğer olduğunu fark etmedim. TBH Olumsuz oy vermeyi gerektirdiğinden emin değilim. Bu geçerli bir alternatif. Ruby geçmişi olmayanlar için bu açık görünmeyebilir. Benim için değildi.
Nick
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.