2012-07-20 13 views
110

Niedawno podjąłem próbę użycia metody Assert.Equals() podczas pisania nowego testu NUnit. Po uruchomieniu ta metoda powoduje wyświetlenie AssertionException z informacją, że na pierwszy rzut oka jest to trochę kłopotliwe. Co tu się dzieje?NUnit's Assert.Equals zgłasza wyjątek "Assert.Equals nie powinien być używany do zapewnień"

+0

możesz dać nam trochę kontekst takich jak konkretny kod, który był jest? Jakiego rodzaju przedmioty porównywałeś, itp.? –

+9

Przepraszam, ale już znalazłem odpowiedź na tę. Poprosiłem o to, abym mógł zamieścić odpowiedź dla potomności. Kontekst nie jest tak naprawdę ważny, jak zobaczysz, czytając odpowiedź. Mam nadzieję, że ta odpowiedź będzie łatwa do wykrycia za pomocą wyszukiwarki internetowej na wiadomości wyjątku. – Odrade

+2

+1 za uczciwość! – stannius

Odpowiedz

164

Assert jest klasą statyczną dziedziczącą po System.Object, ponieważ wszystkie klasy zawierają niejawnie w języku C#. System.Object realizuje się następującym sposobem:

static bool Equals(object a, object b) 

metody na twierdzić, które są przeznaczone do porównywania równości są metody Assert.AreEqual(). Dlatego wywołanie metody Object.Equals() za pośrednictwem klasy Assert w teście jednostkowym jest z pewnością błędem. Aby zapobiec temu błędowi i uniknąć pomyłki, twórcy NUnit celowo ukryli Object.Equals w klasie Assert z implementacją, która zgłasza wyjątek. Oto realizacja:

/// <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 Wyjątkiem jest mylące, ale przynajmniej pozwala wiedzieć zrobiłeś coś złego.

+1

, który zaoszczędził mi godzin bólu głowy. – fregas

+12

Wiadomość jest myląca, ale wpisz ją w Google, a kończy się tutaj na tej odpowiedzi i wszystko jest w porządku. Dzięki Odrade. –

+18

Twórcy NUnit mogą zmienić komunikat i powiedzieć "... użyj Assert.AreEqual()". – WillC

3

tldr;

Assert.AreEqual(a, b); // <-- Compares a, b 

nie:

Assert.Equals(a, b); // <-- Irrelevant equality operator on Assert itself 
Powiązane problemy