อะไรคือจุดประสงค์ของ Verifiable () ใน Moq?


125

มีจุดประสงค์เพื่อVerifiable()อะไร?

หากฉันตรวจสอบMockและปล่อยให้สิ่งนี้ยังคงยืนยันไฟล์SetUp.

แก้ไข:ฉันใช้VerifyAll()เหตุผลในการตรวจสอบทุกอย่าง หลังจากเปลี่ยนเป็นVerify()เฉพาะของฉัน.Verifiable() SetUpถูกตรวจสอบ

คำตอบ:


83

ภาคผนวก: ในฐานะที่เป็นรัฐคำตอบอื่น ๆ วัตถุประสงค์ของการ.Verifiableคือการขอความช่วยเหลือSetupเข้ามาในชุดของ "รอการตัดบัญชีVerify(...)โทร" mock.Verify()ซึ่งจากนั้นจะสามารถเรียกผ่าน

คำชี้แจงของ OP ทำให้ชัดเจนว่านี่คือเป้าหมายและปัญหาเดียวคือการหาสาเหตุว่าทำไมจึงไม่ทำงาน แต่เนื่องจาก @Liam ได้ตรวจสอบคำตอบก็ควรสัมผัสกับสิ่งนี้เช่นกัน: -กรณีการใช้งานที่สำคัญเท่าที่จะทำได้ ดูคือ:

  • การรักษาความแห้งระหว่าง a mock.Setup()และmock.Verify
  • อนุญาตให้คนหนึ่งตัดการเชื่อมต่อการกำหนดค่าการตรวจสอบจากการVerifyโทรจริง(เช่นคุณสามารถตั้งค่าด้วยวิธีการช่วยเหลืออื่น)

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

ORIGINAL: โปรดทราบว่าหากเป็นไปได้ควรทำตามเค้าโครงAAAแทนและด้วยเหตุนี้ควรทำการmock.Verify( expression )โทรอย่างชัดเจนหลังจากทำงานเสร็จแล้วแทนที่จะmock.Setup( ... ).Verifiable()จับคู่กับ a mock.Verify()หรือmock.VerifyAll()ทุกที่ที่เป็นไปได้ (credit: @kzu )


7
@EricSmith มองย้อนกลับไปอย่าคิดว่าฉันใส่มันแรงพอ มีประโยชน์อย่างมากจากการแบ่งงานของคุณออกเป็นกลุ่ม AAA มากกว่าการเน้นที่ความเหมือนกันมากเกินไประหว่างขั้นตอนการจัดเรียงและการยืนยัน 90% ของเวลามีบางอย่างที่จะได้รับจากความแตกต่างของวิธีที่คุณแสดงการโทรยืนยันในตอนท้ายดังนั้นคุณควรใช้เวลามากในการปรับให้เหมาะสมแม้ว่าในบางกรณีจะดูเหมือนการทำซ้ำที่เจ็บปวดก็ตาม ประเด็นหนึ่งที่manning.com/osheroveทำให้ดีมากคือการทำแบบทดสอบให้เหมาะสมกับใครบางคนที่กระโดดเข้ามานั้นสำคัญมาก - จงยึดมั่นในแบบแผน!
Ruben Bartelink

3
ปกติฉันไม่ใช่คนที่จะต่อต้านเมล็ดพันธุ์แห่งภูมิปัญญาที่เป็นที่ยอมรับ แต่ฉันยังไม่มั่นใจในประโยชน์ของ AAA เทียบกับVerifyable()/ VerifyAll()ในทุกกรณี การทดสอบหน่วยปัจจุบันของฉันมีการSetup(...)โทรจำนวนมาก(> 30) สามารถจับคู่แต่ละรายการกับ Verify () ที่เท่ากันเพื่อให้เป็นไปตามแบบแผน แต่ทำให้เกิดการทำซ้ำรหัสจำนวนมากและจะยากกว่าในการดูแลรักษาและอ่านเมื่อจำนวนการทดสอบหน่วยเพิ่มขึ้น ฉันเดาว่าสิ่งที่ฉันถามจริงๆคือสามารถมีข้อยกเว้นได้หากมีการตั้งค่าจำนวนมากหรือเป็นการหลีกเลี่ยงVerifiable()กฎที่ยากและรวดเร็ว?
Steve Chambers

5
@SteveChambers องค์ประกอบสำคัญของ AAA คือไม่ใช่ A * - ควรมีพระราชบัญญัติเดียวและ Assert เดียว ดังนั้นในขณะที่คุณมีความถูกต้องทางเทคนิคในการบอกว่ารหัสนั้นน้อยกว่าสำหรับคุณความบังเอิญที่การตั้งค่าของคุณใช้กับการกระทำ (ย่อย) และการยืนยัน (ย่อย) จะกลายเป็นเขตที่วางทุ่นระเบิด ไม่มันไม่ยากและเร็ว แต่ฉันจะบอกว่าการแนะนำว่ามันใกล้ถึง 50:50 จะเป็นคำแนะนำที่แย่มาก (โปรดทราบว่าคุณไม่จำเป็นต้องทำการตั้งค่าเพื่อทำการ Verify เว้นแต่คุณจะพยายามแนะนำพฤติกรรมบางอย่างในระหว่างการดำเนินการซึ่งเป็นอีกองค์ประกอบหนึ่งของการทดสอบที่ชัดเจน)
Ruben Bartelink

1
@ เลียมและเป็นเรื่องดีมากที่คุณยังคงเชื่อมั่นว่ามันเป็นเครื่องมือที่เหมาะสมสำหรับงานของคุณ - ประเด็นที่แท้จริงของฉันคือการขมวดคิ้วเป็นวิธีการทั่วไปในการทดสอบการเขียนด้วยการล้อเลียน - กล่าวคือแม้ว่าจะได้รับความแห้งอย่างเรียบร้อย ระหว่าง a Setupและ a Verifyที่อาจพลาดการชนะที่สูงกว่าทำได้เพียงแค่ผ่อนคลายข้อ จำกัด DRY ในลักษณะที่แนะนำโดย AAA และกลุ่มกลยุทธ์ที่มีนัยอย่างมาก
Ruben Bartelink

1
@ เลียมขอบคุณสำหรับ prodding; ฉันอัปเดตคำตอบของฉันเนื่องจากคุณถูกต้องในประเด็นที่คุณกำลังทำ ย้อนกลับไปในวันที่ฉันตอบคำถาม SO เช่นนี้โดยทั่วไปมุมมองของฉันมักจะระบุคำตอบแบบปรมาณูอย่างรวบรัดจากนั้นให้คำตอบที่แข่งขันกันเหมือนกับอีกคำตอบหนึ่งในแผนที่ วันนี้ (ถ้าฉันยังคงใช้เวลาในการตอบคำถาม) ฉันน่าจะพยายามให้คำตอบที่สมบูรณ์กว่านี้ในตัวอย่างแรก
Ruben Bartelink

54

เมื่อVerify()วิธีการที่เรียกว่าในตอนท้ายของการทดสอบในกรณีใด ๆ thrownของความคาดหวังที่มีเครื่องหมายเป็นที่ตรวจสอบไม่ได้รับการเรียกแล้วยกเว้น

VerifyAll() ไม่ตรวจสอบความคาดหวังที่ตรวจสอบได้


คุณช่วยอธิบายเพิ่มเติมเกี่ยวกับ VerifyAll () ไม่ตรวจสอบความคาดหวังที่ตรวจสอบได้หรือไม่
เจดับบลิว

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