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

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

Ответ 1

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

static bool Equals(object a, object b)

Методы Assert, предназначенные для сравнения равенства, - это методы Assert.AreEqual(). Поэтому вызов метода Object.Equals() через класс Assert в unit test, безусловно, является ошибкой. Чтобы предотвратить эту ошибку и избежать путаницы, разработчики 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");
 }

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

Ответ 2

TL;DR;

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

не

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