Saya tahu bahwa di Kapibara, Anda dapat melakukan sesuatu seperti ini:
page.should have_css("ol li", :count => 2)
Namun, dengan asumsi halaman tersebut misalnya hanya memiliki satu elemen yang cocok, error tersebut tidak terlalu deskriptif:
1) initial page load shows greetings
Failure/Error: page.should have_css("ol li", :count => 2)
expected css "ol li" to return something
Alih-alih pesan kesalahan yang agak tidak jelas ini, apakah ada cara untuk menulis pernyataan sedemikian rupa sehingga keluaran kesalahan akan menjadi sesuatu seperti 'Saat mencocokkan' ol li ', diharapkan: 2, ditemukan: 1'. Jelas saya bisa membuat logika kustom sendiri untuk perilaku seperti itu - saya bertanya apakah ada cara untuk melakukan ini 'di luar kotak'?
Untuk apa nilainya, saya menggunakan driver Selenium dan RSpec.
page.should have_css("ol li", :count => 2)
belum diterapkan.Jawaban:
Saya lebih suka ini.
expect(page).to have_selector('input', count: 12)
https://github.com/jnicklas/capybara/blob/415e2db70d3b19b46a4d3d0fe62f50400f9d2b61/spec/rspec/matchers_spec.rb
sumber
have_css
:expect(page).to have_css('input', count: 12)
Nah, karena sepertinya tidak ada dukungan out-of-the-box, saya menulis custom matcher ini:
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
Sekarang, Anda dapat melakukan hal-hal seperti:
describe "initial page load", :type => :request do it "has 12 inputs" do visit "/" page.should match_exactly(12, "input") end end
dan mendapatkan keluaran seperti:
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
Itu melakukan trik untuk saat ini, saya akan melihat ke dalam membuat ini bagian dari Kapibara.
sumber
Menurut saya yang berikut ini lebih sederhana, memberikan keluaran yang cukup jelas dan menghilangkan kebutuhan akan pencocokan khusus.
page.all("ol li").count.should eql(2)
Ini kemudian mencetak kesalahan:
expected: 2 got: 3 (compared using eql?) (RSpec::Expectations::ExpectationNotMetError)
sumber
Edit: Seperti yang ditunjukkan oleh @ThomasWalpole, menggunakan
all
menonaktifkan Capybara menunggu / mencoba lagi, jadi jawaban di atas oleh @pandaPower jauh lebih baik.Bagaimana dengan ini?
within('ol') do expect( all('.opportunity_title_wrap').count ).to eq(2) end
sumber
within
, itu memanggil.count
hasilall
yang menonaktifkan menunggu / mencoba lagi. Dengan memanggilcount
hasilall
(yang "larik kosong" adalah pengembalian yang valid) Anda mengonversi ke bilangan bulat dan membandingkannya. Jika perbandingan itu gagal, harapan gagal. Jika sebaliknya Anda meneruskan opsi penghitungan ke salah satu pencocok Kapibara, kapibara akan menunggu / mencoba lagi menemukan pemilih yang ditentukan hingga opsi penghitungan cocok (atau Capybara.default_max_wait_time kedaluwarsa).Praktik terbaik (9/2/2013) saat ini yang direkomendasikan oleh Kapibara adalah sebagai berikut ( sumber ):
page.assert_selector('p#foo', :count => 4)
sumber
Jawaban oleh @pandaPower sangat bagus, tetapi sintaksnya sedikit berbeda untuk saya:
expect(page).to have_selector('.views-row', :count => 30)
sumber