Capybara का उपयोग करके क्वेरी स्ट्रिंग के साथ वर्तमान पथ कैसे प्राप्त करें


144

पृष्ठ url कुछ ऐसा है /people?search=name जब मैंने current_pathcapybara की विधि का उपयोग किया था यह /peopleकेवल वापस आ गया ।

current_path.should == people_path(:search => 'name')

लेकिन यह कहने में विफल रहता है

expected: "/people?search=name"
got: "/people"

हम इसे कैसे पास कर सकते हैं? क्या ऐसा करने का कोई तरीका है?


10
"/people?search=name" एक रास्ता नहीं है"/people"एक रास्ता है
आंद्रेई बोटालोव

जवाबों:


212

मैंने इस जवाब को अपडेट किया है कि कैपिबारा में आधुनिक सम्मेलनों को प्रतिबिंबित करें। मुझे लगता है कि यह आदर्श है क्योंकि यह स्वीकृत उत्तर है, और समाधान ढूंढते समय कितने लोगों को संदर्भित किया जा रहा है। उस के साथ, वर्तमान पथ की जांच करने का सही तरीका has_current_path?Capybara द्वारा प्रदान किए गए मिलान का उपयोग करना है , जैसा कि यहां प्रलेखित किया गया है: यहां देखें

उदाहरण उपयोग:

expect(page).to have_current_path(people_path(search: 'name'))

जैसा कि आप दस्तावेज़ में देख सकते हैं, अन्य विकल्प उपलब्ध हैं। यदि वर्तमान पृष्ठ है, /people?search=nameलेकिन आप केवल इस बात की परवाह करते हैं कि यह /peopleपृष्ठ पर ध्यान दिए बिना है, तो आप only_pathविकल्प भेज सकते हैं :

expect(page).to have_current_path(people_path, only_path: true)

इसके अतिरिक्त, यदि आप संपूर्ण URL की तुलना करना चाहते हैं:

expect(page).to have_current_path(people_url, url: true)

इस विधि को इंगित करने के लिए टॉम वालपोल को श्रेय।


4
मुझे बहुत जल्द इस वाक्यविन्यास की आवश्यकता होगी, मैं एक विरासत आवेदन के लिए परीक्षण लिख रहा हूं। का उपयोग करना current_path.should ==अभी के लिए काम कर रहा है (हालांकि मुझे एक स्ट्रिंग के रूप में एक आगे की ओर स्लैश जोड़ने की आवश्यकता है)। मैं आपको कोड के लिए अग्रिम धन्यवाद दे रहा हूँ जिसकी मुझे आवश्यकता होगी।
टैस

3
URI.parse(current_url).request_uriअधिक रसीला है। देखिए @Lasse Bunk का जवाब।
रिचर्ड जोंस

Capybara 2.5 के रूप में, यह अब सबसे अच्छा जवाब नहीं है। @ टॉम-वालपॉल का जवाब नीचे देखें।
dkniffin

चूंकि पूछने वाले को स्वीकृत उत्तर को बदलने की संभावना नहीं है, इसलिए मैंने आधुनिक समय को प्रतिबिंबित करने के लिए उत्तर को अपडेट कर दिया है। यह नए उपयोगकर्ताओं के लिए अधिक उपयोगी होना चाहिए जो किसी समाधान की तलाश में हों और पहला उत्तर देखें। धन्यवाद @OddityOverseer इसे इंगित करने के लिए
nzifnab

1
के ignore_query: trueबजाय नए Capybara संस्करणों का उपयोगonly_path: true
अलेक्जेंडर

92

मैंने मापदंडों के साथ पूर्ण यूआरएल की तुलना करने के लिए _url के साथ _path विधि को प्रतिस्थापित किया।

current_url.should == people_url(:search => 'name')

4
आपने मेजबान भाग के साथ कैसा व्यवहार किया?
क्रिस निकोला

11
आप current_pathCapybara के नए संस्करणों में भी उपयोग कर सकते हैं और इसके खिलाफ मैच कर सकते हैंpeople_path(...)
जेसन Stirk

जब मैंने पथ का नाम नहीं दिया है ... मेरे पास केवल / उपयोगकर्ता / रजिस्टर है ... तो मुझे इसका उपयोग कैसे करना चाहिए?
गोपाल एस राठौर

क्या होगा यदि यह एक रेंडर पर हो रहा है, ताकि URL html पेज से अलग हो?
बिग पोटैटो

52

बस आधुनिक समय के लिए इस सवाल को अद्यतन करना। Capybara 2.5+ का उपयोग करते समय current_paths की जाँच के लिए वर्तमान सर्वोत्तम अभ्यास current_path मिलानकर्ता का उपयोग करना है, जो पथ की जाँच करने के लिए Capybaras प्रतीक्षा व्यवहार का उपयोग करेगा। यदि request_uri (पथ और क्वेरी स्ट्रिंग) के विरुद्ध जांच करना चाहते हैं

expect(page).to have_current_path(people_path(:search => 'name'))  

यदि केवल पथ भाग चाहते हैं (क्वेरी स्ट्रिंग को अनदेखा कर रहे हैं)

expect(page).to have_current_path(people_path, only_path: true) # Capybara < 2.16
expect(page).to have_current_path(people_path, ignore_query: true) # Capybara >= 2.16

यदि पूर्ण url का मिलान करना है

expect(page).to have_current_path(people_url, url: true) # Capybara < 2.16
expect(page).to have_current_path(people_url) # Capybara >= 2.16

मिलान करने वाला एक स्ट्रिंग लेगा जिसकी तुलना == या एक रेगेक्स से की जा सकती है

expect(page).to have_current_path(/search=name/)

4
इन आधुनिक समयों में इसे उत्तर के रूप में चिह्नित किया जाना चाहिए । यह बहुत सारे अस्पष्ट समय के मुद्दों को सुरक्षित करेगा, धन्यवाद!
Ax

1
@Vanuan rspec shouldसिंटैक्स को चित्रित कर रहा है । आपको expect().toअपने चश्मे का उपयोग करने का प्रयास करना चाहिए ।
नजीफ़नब सिप

1
only_path: trueअब हैignore_query: true
srghma

18

मुझे पता है कि एक उत्तर का चयन किया गया है, लेकिन मैं सिर्फ एक वैकल्पिक समाधान देना चाहता था। इसलिए:

पथ और querystring प्राप्त करने के लिए, request.fullpathरेल की तरह , आप कर सकते हैं:

URI.parse(current_url).request_uri.should == people_path(:search => 'name')

आप अपने टेस्ट क्लास (जैसे ActionDispatch::IntegrationTest) में एक सहायक विधि भी कर सकते हैं जैसे (मैंने जो किया):

def current_fullpath
  URI.parse(current_url).request_uri
end

उम्मीद है की यह मदद करेगा।


1

EDIT: जैसा कि टिनिअनबेरीज़ ने उल्लेख किया है, यह पोर्ट नंबर वाले URL के लिए विफल रहता है। अगर किसी और के पास एक ही शानदार विचार है, तो इसे यहां रखना।

current_url[current_host.size..-1]

गोल्फ के रूप में अच्छी तरह के रूप में (35 वर्ण) URI.parse(current_url).request_uri, लेकिन संभावित रूप से तेजी से क्योंकि वहाँ कोई स्पष्ट URI पार्सिंग शामिल है।

मैंने इसे Capybara में जोड़ने के लिए एक पुल अनुरोध किया है: https://github.com/jnicklas/capybara/pull/1405


यदि current_urlपोर्ट नंबर हो सकता है तो यह काम नहीं करता है । उदाहरण के लिए एक दिया current_urlकी http://foo.com:8888/some/path, current_url[current_host.size..-1]के बराबर होगा :8888/some/path। इसके अलावा, पर्दे के पीछे current_hostउसी तरह के URI.parseतर्क दिए जाते हैं जो @nzifnab ने स्वीकृत उत्तर में सुझाए थे।
तिननीस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.