อะไรคือความแตกต่างระหว่าง mocks และต้นขั้วบน Rhino Mocks?


149

ฉันไม่ได้เล่นกับสิ่งนี้มากพอและมักจะใช้ mocks แต่ฉันสงสัยว่าอะไรคือความแตกต่างระหว่างสองนี้และเมื่อใช้อย่างใดอย่างหนึ่งกับอีกหนึ่งในแรด Mocks

ปรับปรุง:

ฉันยังพบคำตอบสำหรับคำถามของฉันในคำพูดของ Ayende :

ความแตกต่างระหว่างสมบูรณ์และ mocks

คุณจะได้รับความหมายที่แท้จริงของคำเหล่านี้ในบทความนี้: Mocks ไม่กุด ฉันต้องการที่จะมุ่งเน้นไปที่ความแตกต่างจากมุมมองของแรด Mocks

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

หากคุณต้องการตรวจสอบพฤติกรรมของรหัสภายใต้การทดสอบคุณจะใช้จำลองที่มีความคาดหวังที่เหมาะสมและตรวจสอบว่า หากคุณต้องการเพียงแค่ส่งผ่านค่าที่อาจต้องดำเนินการในบางวิธี แต่ไม่ใช่จุดเน้นของการทดสอบนี้คุณจะใช้สตับ

สำคัญ: ต้นขั้วจะไม่ทำให้การทดสอบล้มเหลว


1
ความเป็นไปได้ที่ซ้ำกันของการแกล้งทำเป็นล้อเลียนและขัดถูคืออะไร
nawfal

คำตอบ:


148

ตามนี้

... กล่าวง่ายๆว่ามีความแตกต่างระหว่างวัตถุจำลองและ Stub กับ RhinoMocks ตระหนักดีว่าช่วยให้เราสามารถเขียนการทดสอบที่ระบุวัตถุประสงค์ของพวกเขาได้ดียิ่งขึ้น

วัตถุจำลองใช้เพื่อกำหนดความคาดหวังเช่น: ในสถานการณ์สมมตินี้ฉันคาดว่าจะใช้วิธี A () ในการเรียกด้วยพารามิเตอร์ดังกล่าวและเช่นนั้น Mocks บันทึกและตรวจสอบความคาดหวังดังกล่าว

ในทางตรงกันข้ามมีวัตถุประสงค์ที่แตกต่าง: พวกเขาไม่ได้บันทึกหรือตรวจสอบความคาดหวัง แต่ให้เรา "แทนที่" พฤติกรรมสถานะของ "ปลอม" วัตถุเพื่อใช้ทดสอบสถานการณ์ ...


ผมพบว่าการโพสต์ที่มีประโยชน์อื่นซึ่งสะท้อนข้อความเดียวกันเป็นคำตอบที่ได้รับการยอมรับสำหรับคำถามนี้ - martinfowler.com/articles/mocksArentStubs.html
singh1469

20

โดยทั่วไปการพูดการทดสอบหน่วยจะเรียกใช้ฟังก์ชันและวิธีการต่าง ๆ จากนั้นตรวจสอบเพื่อดูว่ามีการทำงานที่คาดหวังไว้หรือไม่ ฟังก์ชันและเมธอดเหล่านี้อาจต้องการพารามิเตอร์ เราใช้สตับและ mocks เพื่อตอบสนองพารามิเตอร์เหล่านี้ บางครั้งเราอาจเยาะเย้ยวัตถุระดับโลก

ไม่สมบูรณ์

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

mocks

การเยาะเย้ยเป็นต้นขั้วกับการใช้งาน หากฟังก์ชันของเราภายใต้การทดสอบโต้ตอบกับวัตถุจำลองของเราเราสามารถตรวจสอบว่าจำลองนั้นได้รับการโต้ตอบตามที่เราคาดไว้

ตัวอย่างเช่นสมมติว่าเรามีวัตถุผู้ใช้จำลองและเราต้องการตรวจสอบว่าวิธีการ session.login ของเราทำงานได้เราอาจต้องการตรวจสอบว่า user.lastLoggedIn ถูกตั้งค่าไว้ เราสามารถสร้างผู้ใช้จำลองที่ใช้วิธีนี้ เมื่อเราเรียก session.login เราสามารถยืนยันว่า user.lastLoggedIn มีสถานะที่เราคาดไว้

เพื่อสรุป

การเยาะเย้ยเป็นต้นขั้วกับการใช้งานซึ่งช่วยให้เราทดสอบผลข้างเคียง

ความแตกต่างนี้ยังคงสำคัญหรือไม่

เหมือนความแตกต่างระหว่างอุปมาอุปมัยและคำอุปมาอุปมัยความแตกต่างระหว่างต้นขั้วและ mocks นั้นบอบบางและประวัติศาสตร์และอาจมีส่วนเกี่ยวข้องกับชุมชนและปรัชญาที่แตกต่างกันในโลกการทดสอบมากกว่าความแตกต่างทางเทคนิคที่สำคัญ

มันเป็นวิธีการทดสอบที่แตกต่างกันเล็กน้อย การเยาะเย้ยสามารถเขียนได้เหมือนต้นขั้ว ส่วนต้นขั้วสามารถขยายเป็นจำลองได้

คุณควรใช้แบบไหน

คุณอาจพบว่าคุณเริ่มต้นสร้างสตับแล้วในภายหลังคุณอาจพบว่าคุณต้องสร้างเต็มบน mocks สำหรับวัตถุบางอย่างของคุณ คุณอาจต้องการที่จะเยาะเย้ยทุกสิ่งที่คุณไปหรือคุณอาจต้องการเยาะเย้ยที่จำเป็น


7

ความแตกต่างระหว่างจำลองและต้นขั้ว: ด้วยต้นขั้วคุณแก้ไขอินพุตของการทดสอบหน่วยของคุณ: ดังนั้นการทดสอบหน่วยของคุณไม่ได้ยืนยันบนต้นขั้วและต้นขั้วโดยการเขียนการใช้งานใหม่ของวิธีการบางอย่างแก้ไขพฤติกรรมของวัตถุปลอม ด้วย Mock คุณแก้ไข ouput ของการทดสอบหน่วยของคุณ: ดังนั้นการทดสอบหน่วยของคุณคาดหวังในวัตถุจำลองของคุณโดยการตรวจสอบการโต้ตอบภายในในวัตถุจำลองของคุณ


คุณดูเหมือนจะบอกว่าการทดสอบของคุณควร "ตรวจสอบ" ผลลัพธ์ของการเยาะเย้ย ถ้านั่นคือสิ่งที่คุณพูดคุณไม่ถูกต้อง ไม่ควรทดสอบการเยาะเย้ย มันอยู่ที่นั่นเพื่อให้คุณสามารถทดสอบรหัสอื่น ๆ หรือประโยคสุดท้ายของคุณมีความหมายอย่างอื่นหรือไม่?
Andrew Barber

1
สวัสดีแอนดรูในขณะที่ฉันเขียนด้วย Mock คุณแก้ไขผลลัพธ์ของการทดสอบของคุณดังนั้นคุณจะไม่ทดสอบมันมิฉะนั้นฉันได้เขียนว่า Mock อนุญาตให้คุณตรวจสอบการโต้ตอบ (พฤติกรรมความคาดหวัง ... ;-)
Hassan Boutougha

1
ตกลงที่เหมาะสมมากขึ้น ขอขอบคุณสำหรับการชี้แจง!
แอนดรูว์บาร์เบอร์

> ไม่ยืนยันใน stub เหตุใดในไลบรารีการยืนยันจำนวนมากยังคงมีเมธอด aka should have been called withเพื่อยืนยันstubพารามิเตอร์
hellboy


0

สิ่งหนึ่งที่ฉันสังเกตเห็นด้วยคือเมื่อฉันใช้ MockRepository.GenerateMock ฉันต้องกำหนดความคาดหวังอย่างชัดเจนในการเรียกใช้เมธอดเฉพาะเพื่อสกัดกั้นการโทรนั้น ด้วย stubs ดูเหมือนว่าจะตัดวิธีการใด ๆ โดยอัตโนมัติตราบใดที่มันเป็นเสมือน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.