it-swarm.asia

كيفية الحصول على المسار الحالي باستخدام سلسلة الاستعلام باستخدام Capybara

يشبه عنوان url للصفحة /people?search=name بينما كنت أستخدم current_path طريقة capybara ، فقامت بإرجاعها /people فقط.

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

لكنه فشل في القول

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

كيف يمكننا أن نجعلها تمر؟ هل هناك أي طريقة للقيام بذلك؟

138
kriysna

لقد قمت بتحديث هذه الإجابة لتعكس الاتفاقيات الحديثة في كابيبارا. أعتقد أن هذا مثالي لأن هذا هو الحل المقبول ، وما يشار إليه كثير من الناس عند البحث عن حل. مع قول ذلك ، فإن الطريقة الصحيحة للتحقق من المسار الحالي هي استخدام رمز 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)

الفضل لتوم والبول في الإشارة إلى هذه الطريقة.

201
nzifnab

لقد استبدلت طريقة _path بـ _url لتحقيق مقارنة عناوين url الكاملة بالمعلمات.

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

مجرد تحديث هذا السؤال في العصر الحديث. إن أفضل ممارسة حالية للتحقق من current_paths عند استخدام Capybara 2.5+ هي استخدام مطابقات 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

سيأخذ المطابق سلسلة يتم مقارنتها بـ == أو regex لمطابقتها

expect(page).to have_current_path(/search=name/)
49
Thomas Walpole

أعلم أنه تم اختيار إجابة ، لكنني أردت فقط تقديم حل بديل. وبالتالي:

للحصول على المسار واستجواب ، مثل request.fullpath في Rails ، يمكنك القيام بما يلي:

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

يمكنك أيضًا تنفيذ طريقة مساعدة في فصل الاختبار الخاص بك (مثل ActionDispatch::IntegrationTest) مثل هذا (وهذا ما فعلته):

def current_fullpath
  URI.parse(current_url).request_uri
end

أتمنى أن يساعدك هذا.

17
Lasse Bunk

تحرير: كما ذكر Tinynumberes ، فشل هذا لعناوين URL مع رقم المنفذ. الاحتفاظ بها هنا في حال كان لدى أي شخص آخر نفس الفكرة الرائعة.

current_url[current_Host.size..-1]

الغولف أيضًا تمامًا (35 حرفًا) مثل URI.parse(current_url).request_uri ، لكن من المحتمل أن يكون أسرع لأنه لا يوجد تحليل URI واضح.

لقد تقدمت بطلب سحب لإضافة هذا إلى Capybara في: https://github.com/jnicklas/capybara/pull/1405