'ah-ha!' ของฉัน ช่วงเวลาที่เกี่ยวกับการทดสอบในรูบีและทางรถไฟมาเมื่อผมนั่งลงและจริงๆอ่านทรัพยากรที่ชัดเจนเกี่ยวกับเรื่องที่rspecและแตงกวาหนังสือ ฉันแบ่งปันความรังเกียจครั้งแรกของคุณกับแตงกวา แต่แล้วฉันก็ตระหนักว่าฉันกำลังดูภาพจากมุมที่ค่อนข้างผิด
โดยพื้นฐานแล้วแตงกวานั้นเกี่ยวกับ BDD (การพัฒนาที่ขับเคลื่อนด้วยพฤติกรรม) - คุณใช้แตงกวาในการวางแผนคุณสมบัติของคุณสิ่งที่คุณกำลังจะทำต่อไป อืมถัดไปคุณต้องการให้ผู้ใช้สามารถโปรโมตโพสต์ในฟอรัมหรือบางสิ่ง (เพื่อขโมยตัวอย่าง)) ดังนั้นคุณจึงเขียนสิ่งที่ง่าย
Given I am logged in
And I can see the post "BDD is awesome"
When I vote the post up
Then the post should have one more vote
And the page should show a message thanking me for my vote.
โปรดทราบว่าไม่มีการอ้างอิงถึงรหัสใด ๆ ที่เกี่ยวข้องในนั้นค่อนข้างมาก ที่มาในขั้นตอนของคุณ เมื่อคุณปรับโครงสร้างรหัสของคุณใหม่คุณอาจต้องเปลี่ยนคำจำกัดความขั้นตอนของคุณ แต่ลักษณะการทำงาน (คุณลักษณะของคุณ) ไม่จำเป็นต้องเปลี่ยน
ตอนนี้ทุกครั้งที่คุณเรียกใช้คุณสมบัติ Cucumber คุณจะได้รับการแนะนำผ่านวิธีการทดสอบคุณสมบัติโดยใช้ TDD (ทดสอบการพัฒนาที่ขับเคลื่อนด้วย) สิ่งนี้ทำได้ในระดับที่ต่ำกว่าโดยใช้ RSpec
First run - การกำหนดขั้นตอนแรกของฉันไม่ได้ถูกกำหนด คัดลอกบล็อกเพื่อกำหนดในพูด user_steps.rb หรือแม้กระทั่ง session_steps.rb เพราะเกี่ยวข้องกับผู้ใช้และเซสชันของพวกเขา ตอนนี้คุณจะกำหนดว่าผู้ใช้เข้าสู่ระบบได้อย่างไร? คุณสามารถนำพวกเขาผ่านกระบวนการเข้าสู่ระบบ
Given /^I am logged in$/ do
visit login_path
fill_in :name, :with => 'Joe'
fill_in :password, :with => 'Password'
click_button 'submit'
end
ควรจะมีความสุขทั้งหมด ขั้นตอนที่สอง
Given /^I can see the post "(.+)"$/ do |name|
visit post_path(Post.find_by_name(name))
end
อีกครั้งง่ายสวย โปรดทราบว่าถ้าเราทำซ้ำขั้นตอนการเข้าสู่ระบบของเราทั้งหมดหรือวิธีการโพสต์ของเรามีการกำหนดและแสดงให้เห็นว่าเราไม่ต้องเปลี่ยนพฤติกรรม ขั้นตอนที่สาม
When /^I vote the post up$/ do
pending
end
นี่คือที่ที่คุณเริ่มพูดคุยเกี่ยวกับฟังก์ชั่นใหม่ แต่คุณยังไม่รู้ว่ามันยังทำงานอยู่หรือเปล่า คุณลงคะแนนโพสต์ได้อย่างไร คุณอาจคลิกที่ภาพของ +1 หรืออะไรบางอย่างที่โพสต์ ajax ไปยังตัวควบคุมซึ่งส่งคืน JSON หรือบางส่วน ดังนั้นตอนนี้คุณสามารถไปสู่การทดสอบ Rspec ได้อย่างแท้จริง
- ทดสอบมุมมองของคุณเพื่อให้แน่ใจว่าภาพ +1 นั้นปรากฏขึ้น
- ทดสอบคอนโทรลเลอร์ของคุณว่าทำงานอย่างถูกต้องเมื่อได้รับคำขอ ajax ของรูปแบบที่ถูกต้อง (ทั้งเส้นทางที่มีความสุขและไม่มีความสุข - จะเกิดอะไรขึ้นถ้าได้รับรหัสโพสต์ที่ไม่ถูกต้องจะเกิดอะไรขึ้นถ้าผู้ใช้ มันเพิ่มจำนวนคะแนนถูกต้องหรือไม่?)
- ทดสอบจาวาสคริปต์ของคุณว่าตอบสนองถูกต้องเมื่อให้ JSB ในรูปแบบที่ถูกต้อง (อัปเดต +1 ภาพเพื่อแสดงว่ามีการใช้งานหรือไม่ (นึกถึง Google+ ที่นี่ ... ) แสดงข้อความขอบคุณหรือไม่เป็นต้น )
ทั้งหมดนี้ไม่ได้ส่งผลกระทบต่อพฤติกรรม แต่เมื่อคุณจัดการกับการทดสอบระดับล่างเสร็จแล้วมันจะไม่สำคัญที่จะต้องกรอกคำจำกัดความขั้นตอนสำหรับวิธีการลงคะแนนโพสต์ click_link '+1'
มันอาจจะเป็นง่ายๆเป็น และขั้นตอนที่เหลือคือผลการทดสอบซึ่งควรทำอีกครั้งอย่างตรงไปตรงมา และเมื่อคุณทำเสร็จแล้วคุณจะรู้ว่าคุณสมบัติของคุณเสร็จสมบูรณ์แล้ว หากมีการเปลี่ยนแปลงพฤติกรรมที่จำเป็นคุณสามารถปรับแต่งคุณสมบัติของคุณได้มิฉะนั้นคุณสามารถปรับแต่งรหัสการใช้งานของคุณอย่างปลอดภัย
ฉันหวังว่านี่จะสมเหตุสมผล มันทั้งหมดอยู่ด้านบนของหัวของฉัน แต่ฉันคิดว่ามันแสดงให้เห็นถึงความแตกต่างระหว่าง BDD และ TDD และทำไม Cucumber และ RSpec ตอบสนองความต้องการที่แตกต่างกัน