Assert.Equals NUnit выдает исключение «Assert.Equals не следует использовать для утверждений»

132

Недавно я попытался использовать метод Assert.Equals () при написании нового теста NUnit. При выполнении этот метод выдает AssertionExceptionсообщение, что Assert.Equals should not be used for Assertions. на первый взгляд это немного сбивает с толку. Что тут происходит?

Одраде
источник
Можете ли вы дать нам какой-то контекст, например, конкретный код, в котором это было? Какие типы объектов вы сравнивали и т. Д.?
Майк Паркхилл,
9
Извините, но я уже нашел ответ на этот вопрос. Я просто спросил об этом, чтобы опубликовать ответ для потомков. Контекст на самом деле не важен, в чем вы убедитесь, прочитав ответ. Я надеюсь, что этот ответ можно будет легко найти с помощью веб-поиска по сообщению об исключении.
Odrade

Ответы:

201

Assert- это статический класс, унаследованный от System.Object, как и все классы в C # неявно. System.Object реализует следующий метод:

static bool Equals(object a, object b)

Методы в Assert, которые предназначены для сравнения на равенство, являются Assert.AreEqual()методами. Поэтому вызов Object.Equals()метода через класс Assert в модульном тесте, безусловно, является ошибкой. Чтобы предотвратить эту ошибку и избежать путаницы, разработчики NUnit намеренно скрыли Object.Equalsв классе Assert реализацию, которая генерирует исключение. Вот реализация:

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

Конечно, само сообщение об исключении сбивает с толку, но, по крайней мере, позволяет узнать, что вы сделали что-то не так.

Одраде
источник
13
Сообщение сбивает с толку, но введите его в Google, и вы получите этот ответ, и все будет хорошо. Спасибо Одраде.
Стивен Холт,
25
Разработчики NUnit могут изменить сообщение на «... использовать Assert.AreEqual ()».
WillC 05
Почему они просто не сделали метод Equals закрытым?
shytikov 09
4
@shytikov Потому что это невозможно. Вы не можете переопределить виртуальный метод базового класса частным.
Odrade
18

tldr;

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

не:

Assert.Equals(a, b); // <-- Irrelevant equality operator on Assert itself
Doug
источник