Недавно я попытался использовать метод Assert.Equals() при написании нового теста NUnit. После выполнения этого метода вызывается AssertionException
, в котором указывается, что
Assert.Equals should not be used for Assertions.
Это немного озадачивает на первый взгляд. Что здесь происходит?
NUnit Assert.Equals выдает исключение "Assert.Equals не должны использоваться для утверждений"
Ответ 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