เราควรเลียนแบบเอนทิตีและวัตถุที่มีค่าเมื่อทำ DDD หรือไม่


9

หลังจากที่อ่านไม่กี่ บทความเกี่ยวกับnewable VS ฉีดวัตถุและวิธีการแนวความคิดเหล่านี้เกี่ยวข้องกับ DDD บริการหน่วยงานและวัตถุค่าฉันถูกทิ้งให้อยู่กับข้อสงสัยบางอย่างเกี่ยวกับการใช้ newables ในรหัสของฉันโดยเฉพาะอย่างยิ่งในการทดสอบหน่วยของฉัน

ผู้สมัครหลักสำหรับ newables คือ Entities และ Value objects หมายถึงแทนที่จะฉีดการขึ้นต่อกันเหล่านี้ไปยังอ็อบเจกต์อื่นเราควรnewเป็นเพียงตัวอย่างของอ็อบเจกต์เหล่านี้และใช้มันโดยตรงในโค้ด

อย่างไรก็ตามแนวปฏิบัติที่ดีของ DDD สนับสนุนการมอบหมายความรับผิดชอบให้แก่หน่วยงานและวัตถุที่มีค่าหากพวกเขาเห็นว่าเหมาะสม ดังนั้นเอนทิตีและวัตถุค่าจะสิ้นสุดลงด้วยตรรกะทางธุรกิจที่ร้ายแรงบางอย่างในนั้น

ตอนนี้ถ้าบริการทำงานบนเอนทิตีหรือวัตถุที่มีค่าฉันควรล้อเลียนเอนทิตีหรือวัตถุที่มีค่าและส่งจำลองไปยังบริการ (การเยาะเย้ยจะต้องมีinterfaceสำหรับวัตถุค่าหรือหน่วยงานที่ดูเหมือนจะสนับสนุน)

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


เกี่ยวข้อง: stackoverflow.com/q/2833422
Robert Harvey

มันขึ้นอยู่กับว่าคุณเป็นผู้ทดสอบแบบคลาสสิคหรือผู้ชอบเยาะเย้ย: martinfowler.com/articles/mocksArentStubs.html
jhewlett

@ jhewlett นักคลาสสิกคงไม่หัวเราะเยาะอะไรเลย นักเยาะเย้ยส่วนใหญ่น่าจะเป็นเพียงการเยาะเย้ยบริการที่เก็บและโรงงาน (ซึ่งเป็น "injectables"), ไม่เคยนิติบุคคลหรือวัตถุที่มีคุณค่า (ซึ่งเป็น "newables")
Rogério

@ Rogérioเมื่อคุณพูดบริการ คุณหมายถึง Application Services หรือ Domain Services
w0051977

@Songo คุณตัดสินใจทำอะไร? คุณเยาะเย้ย: หน่วยงาน; วัตถุค่าและบริการโดเมน?
w0051977

คำตอบ:


11

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

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

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

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

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


ใน DDD "รุ่นโดเมน" ยังรวมถึงบริการโดเมนที่เก็บและโรงงานไม่เพียง แต่เอนทิตีและวัตถุค่า
Rogério

0

ไว้วางใจชั้นขึ้นอยู่กับว่ามันทำงานอย่างถูกต้องหวังว่าจะล้มเหลวในการทดสอบหน่วยบางอย่างเมื่อสิ่งที่มีไม่ได้ทำงานแล้วมันควรจะได้รับการทดสอบนี้มาก vell อาจจะมีการทดสอบหน่วยที่สำคัญบางอย่างหายไป? อาจมีกรณีที่ยังไม่ทดลองซึ่งจะสร้างข้อผิดพลาดที่จะเกิดขึ้นในชั้นทดสอบของฉันดั้งเดิมและจะไม่ถูกจับในชั้นเรียนขึ้นอยู่กับตัวเอง

ดังนั้นในความเห็นของฉันสำหรับการทดสอบหน่วยคลาสที่ขึ้นต่อกันควรถูกเย้ยหยัน หากไม่ทำเช่นนั้นแสดงว่าเป็นการทดสอบเชิงบูรณาการ

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