Assert.Equals di NUnit genera l'eccezione "Assert.Equals non deve essere utilizzato per asserzioni"


132

Di recente ho tentato di utilizzare il metodo Assert.Equals () durante la scrittura di un nuovo test NUnit. Al momento dell'esecuzione, questo metodo AssertionExceptionindica che Assert.Equals should not be used for Assertions. a prima vista questo è un po 'sconcertante. Cosa sta succedendo qui?


Puoi darci qualche contesto come il particolare codice in cui si trovava? Che tipo di oggetti stavi confrontando, ecc.?
Mike Parkhill,

9
Scusa, ma ho già trovato la risposta a questa. L'ho appena chiesto in modo da poter pubblicare la risposta per i posteri. Il contesto non è molto importante, come vedrai leggendo la risposta. Spero che questa risposta sia facilmente individuabile tramite la ricerca web sul messaggio di eccezione.
Odrade,

Risposte:


201

Assertè una classe statica che eredita da System.Object, come tutte le classi fanno implicitamente in C #. System.Object implementa il seguente metodo:

static bool Equals(object a, object b)

I metodi su Assert che sono destinati al confronto di uguaglianza sono i Assert.AreEqual()metodi. Pertanto, chiamare il Object.Equals()metodo tramite la classe Assert in un unit test è sicuramente un errore. Al fine di prevenire questo errore ed evitare confusione, gli sviluppatori di NUnit si sono intenzionalmente nascosti Object.Equalsnella classe Assert con un'implementazione che genera un'eccezione. Ecco l'implementazione:

/// <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");
 }

Ovviamente lo stesso messaggio di eccezione è confuso, ma almeno ti fa sapere che hai fatto qualcosa di sbagliato.


13
Il messaggio è confuso, ma inseriscilo in Google e finisci qui a questa risposta e tutto va bene. Grazie Odrade.
Stephen Holt,

25
Gli sviluppatori di NUnit potrebbero cambiare il messaggio per dire "... usa Assert.AreEqual ()".
WillC,

Perché invece non hanno reso privato il metodo Equals?
shytikov,

4
@shytikov Perché questo è impossibile. Non è possibile sovrascrivere un metodo virtuale da una classe di base con una classe privata.
Odrade,

18

TLDR;

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

non:

Assert.Equals(a, b); // <-- Irrelevant equality operator on Assert itself
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.