RSpec: อะไรคือความแตกต่างระหว่างคุณสมบัติและข้อกำหนดคำขอ?


113

เป็นความแตกต่างทางความคิดระหว่าง rspec อะไรรายละเอียดคุณลักษณะและรายละเอียดคำขอ ?

จากเอกสารข้อมูลจำเพาะคุณลักษณะ:

คุณลักษณะเฉพาะคือการทดสอบระดับสูงที่มีไว้เพื่อใช้ประโยชน์จากฟังก์ชันการทำงานผ่านแอปพลิเคชัน ควรขับเคลื่อนแอปพลิเคชันผ่านทางอินเทอร์เฟซภายนอกเท่านั้นโดยปกติจะเป็นหน้าเว็บ

และสำหรับรายละเอียดการร้องขอ:

ข้อกำหนดการร้องขอมีกระดาษห่อบาง ๆ สำหรับการทดสอบการรวม Rails และได้รับการออกแบบมาเพื่อขับเคลื่อนพฤติกรรมผ่านสแต็กเต็มรูปแบบรวมถึงการกำหนดเส้นทาง (จัดทำโดย Rails) และไม่มีการขีดข่วน (ขึ้นอยู่กับคุณ) ด้วยข้อกำหนดคำขอคุณสามารถ:

  • ระบุคำขอเดียว
  • ระบุคำขอหลายรายการในตัวควบคุมหลายตัว
  • ระบุคำขอหลายรายการในหลายเซสชัน

ฉันรู้ว่าข้อกำหนดคุณสมบัติใช้Capybaraและขอข้อกำหนดไม่ได้ แต่นั่นแทบจะไม่เข้ากับแนวคิดที่แตกต่างกัน

คำตอบ:


147

ความแตกต่างทางแนวคิดคือโดยปกติคุณกำลังทดสอบเรื่องราวของผู้ใช้และการโต้ตอบทั้งหมดควรขับเคลื่อนผ่านอินเทอร์เฟซผู้ใช้ นั่นคือจุดที่ Capybara เข้ามาข้อมูลจำเพาะของคำขอยังคงทดสอบพฤติกรรมของแอปพลิเคชันของคุณและไม่มีความคาดหวังว่าจะสามารถอ่านได้ที่การทดสอบการยอมรับจะมี ดังนั้นจึงมีคุณลักษณะสำหรับไวยากรณ์ที่ปรับปรุงใหม่สำหรับการทดสอบการยอมรับ

ความแตกต่างทางเทคนิครวมถึงข้อกำหนดของคำขอรวมการทดสอบการรวม Rails ในขณะที่ข้อกำหนดคุณสมบัติไม่ ซึ่งหมายความว่าคุณสามารถใช้วิธีรับโพสต์ใส่ลบและยืนยันคำตอบได้ ด้วยข้อกำหนดคุณลักษณะคุณควรผลักดันการโต้ตอบทั้งหมดผ่านเบราว์เซอร์และใช้วิธีการเช่นเยี่ยมชมและยืนยันกับเพจ

ฉันขอแนะนำให้อ่าน feature_spec.feature ในซอร์สโค้ด rspec-rail บน github ฉันหวังว่านี่จะช่วยได้.


2
ดังนั้นคุณขอแนะนำให้ใช้ทั้งคุณสมบัติและข้อกำหนดของคำขอหรืออย่างใดอย่างหนึ่งเพียงพอหรือไม่ (ยังใหม่กับ TDD ... )
robertwbradford

2
ฉันใช้ทั้งสองอย่าง @robertwbradford ฉันใช้ข้อมูลจำเพาะคุณลักษณะเพื่อขับเคลื่อนภายนอกในการทดสอบ - ทดสอบประสบการณ์ของผู้ใช้จากนั้นสร้างฟังก์ชันโดยใช้การทดสอบหน่วย ผมใช้รายละเอียดการร้องขอสำหรับการทดสอบการตอบสนอง - เช่นใน sessions_spec ผมอาจจะมีการอธิบาย"GET /login"บล็อกกับความคาดหวังในitบล็อกเช่นexpect(response.status).to eq(200)และexpect(response).to render_template(:new)หรือในdescribe "POST /sessions"การcontext "with valid credentials"บล็อกด้วยexpect(response).to redirect_to(user)และfollow_redirect!; expect(response.body).to include("Signed in")
ริชาร์ดจอร์แดน

5
และคุณใช้สเปคคอนโทรลเลอร์ด้วยหรือเปล่า? ดูเหมือนว่าจะมีความซ้ำซ้อนเล็กน้อยระหว่างสิ่งที่คุณทดสอบตามข้อกำหนดของคำขอและสิ่งที่ทดสอบตามปกติในข้อกำหนดของคอนโทรลเลอร์
Ernesto

5
กล่าวได้ว่าโพสต์ที่เชื่อมโยงด้านบนอธิบายความแตกต่างอย่างชัดเจน ใช้ข้อกำหนดคำขอเพื่อทดสอบผ่าน API ใช้ข้อกำหนดคุณลักษณะเพื่อทดสอบผ่านส่วนหน้า
Damien Roche

2
@RichardJordan: คำถาม: ในรายละเอียดคุณลักษณะคุณจะแนะนำให้ใช้ Rails paths (เช่นvisit users_path) หรือ hardcoded strings ( visit '/users')? โดยส่วนตัวแล้วฉันไม่ต้องการใช้แอปภายในใด ๆ ในข้อกำหนดประเภทนี้
tokland
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.