Niedawno próbowałem użyć metody Assert.Equals () podczas pisania nowego testu NUnit. Po wykonaniu tej metody rzuca AssertionException
stwierdzenie, że
Assert.Equals should not be used for Assertions.
na pierwszy rzut oka jest to nieco zaskakujące. Co tu się dzieje?
134
Odpowiedzi:
Assert
jest klasą statyczną dziedziczącą po System.Object, tak jak wszystkie klasy robią to niejawnie w C #. System.Object implementuje następującą metodę:static bool Equals(object a, object b)
Metody na Assert, które są przeznaczone do porównania równości, są
Assert.AreEqual()
metodami. Dlatego wywołanieObject.Equals()
metody za pomocą klasy Assert w teście jednostkowym jest z pewnością błędem. Aby zapobiec temu błędowi i uniknąć nieporozumień, twórcy NUnit celowo ukryliObject.Equals
w klasie Assert implementację, która zgłasza wyjątek. Oto implementacja:/// <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"); }
Oczywiście sam komunikat o wyjątku jest mylący, ale przynajmniej informuje Cię, że zrobiłeś coś złego.
źródło
Equals
połączeniaAreEqual
zamiast wyświetlać tę mylącą wiadomość ...tldr;
Assert.AreEqual(a, b); // <-- Compares a, b
nie:
Assert.Equals(a, b); // <-- Irrelevant equality operator on Assert itself
źródło