O Assert.Equals do NUnit lança a exceção "Assert.Equals não deve ser usado para asserções"

132

Recentemente, tentei usar o método Assert.Equals () ao escrever um novo teste NUnit. Após a execução, esse método lança uma AssertionExceptiondeclaração de que Assert.Equals should not be used for Assertions. Isso é um pouco desconcertante à primeira vista. O que está acontecendo aqui?

Odrade
fonte
Você pode nos dar algum contexto, como o código específico em que estava? Que tipo de objetos você estava comparando etc.?
21812 Mike Parkhill
9
Desculpe, mas eu já encontrei a resposta para este. Eu apenas perguntei para que eu pudesse postar a resposta para a posteridade. O contexto não é realmente importante, como você verá lendo a resposta. Espero que essa resposta seja facilmente detectável por meio da pesquisa na Web na mensagem de exceção.
Odrade

Respostas:

201

Asserté uma classe estática herdada de System.Object, como todas as classes implicitamente em C #. System.Object implementa o seguinte método:

static bool Equals(object a, object b)

Os métodos em Assert que se destinam à comparação de igualdade são os Assert.AreEqual()métodos. Portanto, chamar o Object.Equals()método através da classe Assert em um teste de unidade é certamente um erro. Para evitar esse erro e evitar confusões, os desenvolvedores do NUnit ocultaram intencionalmente Object.Equalsa classe Assert com uma implementação que gera uma exceção. Aqui está a implementação:

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

É claro que a própria mensagem de exceção é confusa, mas pelo menos permite que você saiba que fez algo errado.

Odrade
fonte
13
A mensagem é confusa, mas digite-a no Google e você acaba aqui nesta resposta e está tudo bem. Obrigado Odrade.
Stephen Holt
25
Os desenvolvedores do NUnit podem alterar a mensagem para dizer "... use Assert.AreEqual ()".
WillC
Por que eles simplesmente não tornaram o método Equals privado?
shytikov
4
@shytikov Porque isso é impossível. Você não pode substituir um método virtual de uma classe base por um privado.
Odrade
18

tldr;

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

não:

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