วิธีรับพา ธ ปัจจุบันด้วยสตริงการสืบค้นโดยใช้ Capybara


144

URL ของหน้าเป็นสิ่ง/people?search=name ที่ฉันต้องการในขณะที่ฉันใช้current_pathวิธีการของ capybara ที่ส่งคืน/peopleเท่านั้น

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

แต่มันล้มเหลวในการพูด

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

เราจะทำให้มันผ่านไปได้อย่างไร มีวิธีการทำเช่นนี้หรือไม่?


10
"/people?search=name" ไม่ได้เป็นเส้นทาง "/people"เป็นเส้นทาง
Andrei Botalov

คำตอบ:


212

ฉันได้อัปเดตคำตอบนี้เพื่อสะท้อนถึงอนุสัญญาที่ทันสมัยใน capybara ฉันคิดว่านี่เป็นอุดมคติเพราะนี่เป็นคำตอบที่ได้รับการยอมรับและมีคนจำนวนมากที่ถูกอ้างถึงเมื่อมองหาวิธีแก้ปัญหา ด้วยวิธีที่กล่าวมาวิธีที่ถูกต้องในการตรวจสอบเส้นทางปัจจุบันคือใช้ตัว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)

ขอมอบเครดิตให้แก่ Tom Walpole สำหรับการชี้วิธีนี้


4
ฉันอาจต้องใช้ไวยากรณ์นี้ในไม่ช้าฉันกำลังเขียนการทดสอบสำหรับแอปพลิเคชันรุ่นเก่า การใช้งานใช้current_path.should ==งานได้ในตอนนี้ (แต่ฉันต้องเพิ่มเครื่องหมายสแลชต่อท้ายเป็นสตริง) ฉันขอขอบคุณล่วงหน้าสำหรับรหัสที่ฉันจะต้อง
Tass

3
URI.parse(current_url).request_uriรวบรัดมากขึ้น ดูคำตอบของ @Lasse Bunk
Richard Jones

ในฐานะของ Capybara 2.5 นี่ไม่ใช่คำตอบที่ดีที่สุดอีกต่อไป ดูคำตอบของ @ tom-walpole ด้านล่าง
dkniffin

เนื่องจากผู้ถามไม่น่าจะเปลี่ยนคำตอบที่ยอมรับได้ฉันจึงอัปเดตคำตอบเพื่อให้สอดคล้องกับยุคปัจจุบัน สิ่งนี้จะมีประโยชน์มากขึ้นสำหรับผู้ใช้ใหม่ที่กำลังมองหาวิธีแก้ปัญหาและดูคำตอบแรก ขอบคุณ @OddityOverseer สำหรับการชี้ให้เห็น
nzifnab

1
สำหรับ Capybara เวอร์ชั่นใหม่ให้ใช้ignore_query: trueแทนonly_path: true
Alexander

92

ฉันแทนที่เมธอด _path ด้วย _url เพื่อให้ได้การเปรียบเทียบ URL แบบเต็มกับพารามิเตอร์

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

4
คุณจัดการกับส่วนโฮสต์อย่างไร
Chris Nicola

11
นอกจากนี้คุณยังสามารถใช้current_pathใน Capybara เวอร์ชันใหม่และจับคู่กับมันได้people_path(...)
Jason Stirk

เมื่อฉันไม่มีชื่อเส้นทาง ... ฉันมี / ผู้ใช้ / ลงทะเบียนเท่านั้น ... แล้วฉันควรใช้มันอย่างไร?
Gopal S Rathore

จะเกิดอะไรขึ้นหากมีการแสดงผลดังนั้น URL จึงแตกต่างจากหน้า html
bigpotato

52

เพียงแค่อัปเดตคำถามนี้ให้ทันสมัย แนวปฏิบัติที่เหมาะสมที่สุดในปัจจุบันสำหรับการตรวจสอบ current_paths เมื่อใช้ Capybara 2.5+ คือการใช้ current_path matcher ซึ่งจะใช้ 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

matcher จะใช้สตริงที่ถูกเปรียบเทียบกับ == หรือ regex เพื่อจับคู่

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

4
ในยุคนี้นี้ควรจะทำเครื่องหมายเป็นคำตอบ นี่จะช่วยแก้ปัญหาเรื่องเวลาที่คลุมเครือได้มากขอบคุณ!
ขวาน

1
@Vanuan rspec ได้เลิกใช้งานshouldไวยากรณ์แล้ว คุณควรมุ่งมั่นที่จะใช้expect().toในรายละเอียดของคุณไปข้างหน้า
nzifnab

1
only_path: trueได้แล้วignore_query: true
srghma

18

ฉันรู้ว่าคำตอบถูกเลือกแล้ว แต่ฉันต้องการให้ทางเลือกอื่น ดังนั้น:

ในการรับเส้นทางและการสอบถามเช่นเดียวกับ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

หวังว่านี่จะช่วยได้


1

แก้ไข: ดังที่ Tinynumberes กล่าวถึงสิ่งนี้ล้มเหลวสำหรับ URL ที่มีหมายเลขพอร์ต เก็บไว้ที่นี่ในกรณีที่คนอื่นมีความคิดที่ยอดเยี่ยมเหมือนกัน

current_url[current_host.size..-1]

golfs เหมือนกัน (35 chars) เหมือน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 แนะนำในคำตอบที่ยอมรับ
Tinynumbers
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.