Assert.Equals de NUnit lanza la excepción "Assert.Equals no debe usarse para afirmaciones"

132

Recientemente intenté usar el método Assert.Equals () al escribir una nueva prueba de NUnit. Tras la ejecución, este método arroja una AssertionExceptionafirmación de que Assert.Equals should not be used for Assertions. esto es un poco desconcertante a primera vista. ¿Que está pasando aqui?

Odrade
fuente
¿Puede darnos algún contexto, como el código particular en el que se encuentra? ¿Qué tipo de objetos comparabas, etc.?
Mike Parkhill
9
Lo siento, pero ya encontré la respuesta a esta. Simplemente lo pregunté para poder publicar la respuesta para la posteridad. El contexto no es realmente importante, como verá al leer la respuesta. Espero que esta respuesta sea fácilmente detectable a través de la búsqueda web en el mensaje de excepción.
Odrade

Respuestas:

201

Assertes una clase estática que hereda de System.Object, como todas las clases lo hacen implícitamente en C #. System.Object implementa el siguiente método:

static bool Equals(object a, object b)

Los métodos en Assert que están destinados a la comparación de igualdad son los Assert.AreEqual()métodos. Por lo tanto, llamar al Object.Equals()método a través de la clase Assert en una prueba unitaria es ciertamente un error. Para evitar este error y evitar confusiones, los desarrolladores de NUnit se han ocultado intencionalmente Object.Equalsen la clase Assert con una implementación que arroja una excepción. Aquí está la implementación:

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

Por supuesto, el mensaje de excepción en sí mismo es confuso, pero al menos te permite saber que has hecho algo mal.

Odrade
fuente
13
El mensaje es confuso, pero ingréselo en Google y terminará aquí mismo con esta respuesta y todo estará bien. Gracias Odrade
Stephen Holt
25
Los desarrolladores de NUnit podrían cambiar el mensaje para decir "... use Assert.AreEqual ()".
WillC
¿Por qué simplemente no hicieron privado el método Equals?
shytikov
44
@shytikov Porque eso es imposible. No puede anular un método virtual de una clase base con uno privado.
Odrade
18

tldr;

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

no:

Assert.Equals(a, b); // <-- Irrelevant equality operator on Assert itself
Doug
fuente