ฉันเพิ่งพยายามใช้วิธี 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