ฉันเพิ่งพยายามใช้วิธี Assert.Equals () เมื่อเขียนการทดสอบ NUnit ใหม่ เมื่อดำเนินการตามวิธีนี้จะแสดงAssertionExceptionข้อความว่า
Assert.Equals should not be used for Assertions. นี่เป็นเรื่องที่ทำให้งงงวยเล็กน้อยในตอนแรก เกิดอะไรขึ้นที่นี่?
ฉันเพิ่งพยายามใช้วิธี Assert.Equals () เมื่อเขียนการทดสอบ NUnit ใหม่ เมื่อดำเนินการตามวิธีนี้จะแสดงAssertionExceptionข้อความว่า
Assert.Equals should not be used for Assertions. นี่เป็นเรื่องที่ทำให้งงงวยเล็กน้อยในตอนแรก เกิดอะไรขึ้นที่นี่?
คำตอบ:
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");
}
แน่นอนว่าข้อความข้อยกเว้นนั้นสร้างความสับสน แต่อย่างน้อยมันก็ช่วยให้คุณรู้ว่าคุณทำอะไรผิดพลาด
TLDR;
Assert.AreEqual(a, b); // <-- Compares a, b
ไม่:
Assert.Equals(a, b); // <-- Irrelevant equality operator on Assert itself