2011-07-18 5 views
68

मैं जानता हूँ कि Capybara में, आप कुछ इस तरह कर सकते हैं कि:उचित त्रुटि संदेश के साथ Capybara का उपयोग कर तत्वों की संख्या पर जोर कैसे देना है?

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

हालांकि, उस पेज संभालने है उदाहरण के लिए केवल एक ही मिलान तत्व के लिए, त्रुटि बहुत वर्णनात्मक नहीं है:

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

इसके बजाय इस बदले में अस्पष्ट त्रुटि संदेश, इस तरह से इस तरह से दावा लिखने का एक तरीका है कि त्रुटि आउटपुट 'ओल ली' से मिलान करते समय कुछ होगा, अपेक्षित: 2, मिला: 1 '। जाहिर है, मैं इस तरह के व्यवहार के लिए खुद को एक कस्टम तर्क बना सकता हूं - मैं पूछ रहा हूं कि यह 'बॉक्स से बाहर' करने का कोई तरीका है?

इसके लायक होने के लिए, मैं सेलेनियम ड्राइवर और आरएसपीईसी का उपयोग कर रहा हूं।

+0

बस लोगों को पता है, "पेज। Should have_css (" ol li ",: count => 2)" capybara में लागू किया गया था। मुझे लगता है कि स्कोप के साथ अत्यधिक प्रयोग करने योग्य है: ("ol.users-सूची") के भीतर करते page.should have_css ('ली',: गिनती => 3) अंत – rafaelkin

+0

@rafaelkin, बस स्पष्ट करने के लिए: करता है कैपिबारा अब रिपोर्ट करें उदाहरण के लिए तत्व में विसंगति अधिक विस्तार से गिनती है? मैंने थोड़ी देर के लिए कैपिबारा का पालन नहीं किया है, लेकिन जब मैंने सवाल उठाया तो समस्या वापस त्रुटि संदेश के प्रारूप के बारे में थी, न कि 'पेज। Should have_css ("ol li",: count => 2) 'होगा पहले ही लागू नहीं किया गया है। – merryprankster

+0

दोस्तों, मुझे एक एहसास है कि वर्तमान में स्वीकृत उत्तर (= मेरा अपना) अब सबसे अच्छा नहीं है, लेकिन इसका मूल्यांकन करने के लिए समय नहीं है (रूबी के साथ काम नहीं करते) यह निर्धारित करने के लिए कि कौन से सुझाए गए समाधान सबसे अच्छे हैं। मैं स्वीकार्य उत्तर को रिचर्ड के बदले में बदल दूंगा क्योंकि इसमें सम्मिलन का आउटपुट शामिल है जो मूल मुद्दे को संबोधित करता है। – merryprankster

उत्तर

144

मुझे यह बहुत अच्छा लगता है।

expect(page).to have_selector('input', count: 12) 

https://github.com/jnicklas/capybara/blob/415e2db70d3b19b46a4d3d0fe62f50400f9d2b61/spec/rspec/matchers_spec.rb

+0

भयानक समाधान। – nfriend21

+9

'have_css' के साथ भी काम करता है: 'उम्मीद (पृष्ठ)। Have_css (' इनपुट ', गिनती: 12)' –

22

ठीक है, ऐसा लगता है के रूप में कोई समर्थन नहीं बाहर के बॉक्स, मैं इस कस्टम मिलान लिखा है: अब

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 

, आप कर सकते हैं सामान की तरह:

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

और आउटपुट प्राप्त करें:

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 

अब यह चाल है, मैं कैपिबरा के इस हिस्से को बनाने में देखूंगा।

+0

ऐसा लगता है कि कैपिबरा में इसे ठीक करना आसान नहीं है: https://github.com/jnicklas/capybara/issues/331 – merryprankster

+0

वास्तव में उपयोगी कोड स्निपेट। धन्यवाद। –

+0

इसके लिए धन्यवाद! – Calvin

14

मुझे लगता है कि निम्नलिखित सरल है, काफी स्पष्ट उत्पादन देता है और एक कस्टम मिलान की आवश्यकता समाप्त।

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

यह तो त्रुटि पर बाहर प्रिंट:

 expected: 2 
     got: 3 

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

यह उम्मीद पूरी होने की प्रतीक्षा नहीं करता है, उदाहरण के लिए जब अभी भी AJAX अनुरोध लंबित हैं। –

3

वर्तमान (2013/09/02) सबसे अच्छा अभ्यास Capybara द्वारा सिफारिश की निम्नलिखित (source) है:

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

+3

ओपी आरपीसीईसी का उपयोग कर रहा है, यह इकाई परीक्षण – Starkers

-4

@ पांडापावर का जवाब बहुत अच्छा है, लेकिन वाक्यविन्यास मेरे लिए थोड़ा अलग था:

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

हैश रॉकेट का उपयोग "अलग वाक्यविन्यास" के रूप में योग्य नहीं है। – premjg

+2

मैं एक रूबी देव नहीं हूं और यह महसूस नहीं किया कि दोनों वाक्यविन्यास बराबर थे। टीबीएच मुझे यकीन नहीं है कि यह डाउनवॉटिंग वारंट करता है। यह एक वैध विकल्प है। उन लोगों के लिए जो रूबी पृष्ठभूमि से नहीं हैं, यह स्पष्ट प्रतीत नहीं हो सकता है। यह मेरे लिए नहीं था। – Nick

7

इस बारे में कैसे?

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

लवली उत्तर +1 –

+0

यह कैपिबरस को पूरी तरह से प्रतीक्षा/पुनः प्रयास करने से पराजित करता है और कभी भी एक अनुशंसित समाधान नहीं होना चाहिए। –

+0

@ थॉमस वालपोल मुझे यकीन नहीं है कि आप किस बारे में बात कर रहे हैं। किसी अन्य तत्व के भीतर तत्व को किसी भी तरह से कैपिबारा में प्रतीक्षा/पुनः प्रयास करने को कैसे स्पर्श करता है? –

संबंधित मुद्दे