उचित त्रुटि संदेश के साथ Capybara का उपयोग करने वाले तत्वों की संख्या का आकलन कैसे करें?


86

मुझे पता है कि 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 '। जाहिर है मैं इस तरह के व्यवहार के लिए खुद को एक कस्टम तर्क बना सकता हूं - मैं पूछ रहा हूं कि क्या यह 'आउट ऑफ द बॉक्स' करने का कोई तरीका है?

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


बस लोगों को पता है, "पेज.शोल्ड has_css (" ओएल ली ": काउंट => 2)" कोप्यारा में लागू किया गया था। मुझे लगता है कि यह स्कोप के साथ अत्यधिक प्रयोग करने योग्य है: भीतर ("ol.users-list") करते हैं। page.should has_css ('li': count => 3) end
rafaelkin

@rafaelkin, बस स्पष्ट करने के लिए: क्या capybara अब रिपोर्ट करता है जैसे तत्व में बेमेल अधिक विस्तार के साथ गिनती? मैंने अभी कुछ समय के लिए कैपिबारा का पालन नहीं किया है, लेकिन यह मुद्दा तब वापस आया जब मैंने सवाल किया कि त्रुटि संदेश के प्रारूप के बारे में था, ऐसा नहीं कि page.should have_css("ol li", :count => 2)पहले से ही इसे लागू नहीं किया गया था।
merryprankster

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

जवाबों:



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

यह अब के लिए चाल है, मैं Capybara का यह हिस्सा बनाने में दिखेगा।


Capybara में इसे ठीक करने जैसा लगता है सीधा नहीं है: github.com/jnicklas/capybara/issues/331
merryprankster

14

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

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

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

      expected: 2
       got: 3

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

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

9

संपादित करें: जैसा कि @ThomasWalpole द्वारा बताया गया है, allCapybara के वेटिंग / रिट्रीटिंग को अक्षम करता है, इसलिए @pandaPower द्वारा ऊपर दिया गया उत्तर बहुत बेहतर है।

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

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

2
यह पूरी तरह से Capybaras प्रतीक्षा / पुन: प्रयास करने को हरा देता है और कभी भी अनुशंसित समाधान नहीं होना चाहिए।
थॉमस वॉलपोले

@ThomasWalpole मुझे यकीन नहीं है कि आप किस बारे में बात कर रहे हैं। किसी अन्य तत्व के भीतर एक तत्व की तलाश किसी भी तरह से Capybara में प्रतीक्षा / पुनः प्रयास को कैसे छूती है?
लगातार मेकिंग

2
@ConstantMeiring यह नहीं है within, यह प्रतीक्षा / पुनः प्रयास अक्षम करने .countके परिणामों को बुला allरहा है। countके परिणामों पर कॉल करके all(जो एक खाली "सरणी" के लिए एक वैध रिटर्न है) आप एक पूर्णांक में परिवर्तित करते हैं और इसकी तुलना करते हैं। यदि वह तुलना विफल हो जाती है तो अपेक्षा विफल हो जाती है। यदि इसके बजाय आप Capybara के किसी एक मिलानकर्ता के लिए काउंट ऑप्शन पास करते हैं, तो capybara काउंट ऑप्शन (या Capybara.default_max_wait_time की समय सीमा समाप्त होने तक) निर्दिष्ट चयनकर्ता को खोजने / इंतजार करने का प्रयास करेगा।
थॉमस वॉलपोल

4

Capybara द्वारा अनुशंसित वर्तमान (9/2/2013) निम्नलिखित अभ्यास है ( स्रोत ):

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


-4

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

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

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

2
मैं एक रूबी देव नहीं हूं और महसूस नहीं किया कि दो वाक्यविन्यास समान थे। टीबीएच मुझे यकीन नहीं है कि यह अपमानजनक है। यह एक वैध विकल्प है। रूबी पृष्ठभूमि से नहीं उन लोगों के लिए यह स्पष्ट नहीं लग सकता है। यह मेरे लिए नहीं था।
निक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.