NUnit's Assert.Equals แสดงข้อยกเว้น "Assert.Equals ไม่ควรใช้ในการยืนยัน"


132

ฉันเพิ่งพยายามใช้วิธี Assert.Equals () เมื่อเขียนการทดสอบ NUnit ใหม่ เมื่อดำเนินการตามวิธีนี้จะแสดงAssertionExceptionข้อความว่า Assert.Equals should not be used for Assertions. นี่เป็นเรื่องที่ทำให้งงงวยเล็กน้อยในตอนแรก เกิดอะไรขึ้นที่นี่?


คุณช่วยให้บริบทบางอย่างแก่เราเช่นรหัสเฉพาะที่มีอยู่ในนั้นได้ไหม คุณกำลังเปรียบเทียบวัตถุประเภทใด ฯลฯ
Mike Parkhill

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

คำตอบ:


201

Assertเป็นคลาสแบบคงที่ที่สืบทอดมาจาก System.Object เนื่องจากคลาสทั้งหมดทำโดยปริยายใน C # System.Object ใช้วิธีการต่อไปนี้:

static bool Equals(object a, object b)

วิธีการบน Assert ซึ่งมีไว้สำหรับการเปรียบเทียบความเท่าเทียมกันคือAssert.AreEqual()วิธีการ ดังนั้นการเรียกใช้Object.Equals()เมธอดผ่านคลาส Assert ในการทดสอบหน่วยจึงเป็นความผิดพลาดอย่างแน่นอน เพื่อป้องกันความผิดพลาดนี้และหลีกเลี่ยงความสับสนนักพัฒนาของ NUnit ได้ตั้งใจซ่อนไว้Object.Equalsในคลาส Assert ด้วยการใช้งานที่ทำให้เกิดข้อยกเว้น นี่คือการใช้งาน:

/// <summary>
 /// The Equals method throws an AssertionException. This is done
 /// to make sure there is no mistake by calling this function.
 /// </summary>
 /// <param name="a"></param>
 /// <param name="b"></param>
 [EditorBrowsable(EditorBrowsableState.Never)]
 public static new bool Equals(object a, object b)
 {
     // TODO: This should probably be InvalidOperationException
     throw new AssertionException("Assert.Equals should not be used for Assertions");
 }

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


13
ข้อความสับสน แต่ป้อนลงใน Google และคุณจะจบลงที่นี่ที่คำตอบนี้และทุกอย่างก็เรียบร้อยดี ขอบคุณ Odrade
Stephen Holt

25
นักพัฒนาของ NUnit สามารถเปลี่ยนข้อความเป็น "... use Assert.AreEqual ()"
WillC

ทำไมพวกเขาถึงไม่ทำให้เมธอด Equals เป็นแบบส่วนตัวแทน
shytikov

4
@shytikov เพราะนั่นเป็นไปไม่ได้ คุณไม่สามารถแทนที่เมธอดเสมือนจากคลาสพื้นฐานด้วยไพรเวตได้
Odrade

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