NUnit's Assert.Equals викидає виняток "Assert.Equals не слід використовувати для тверджень"


132

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


Чи можете ви дати нам якийсь контекст, такий як конкретний код, у якому він був? Який тип об’єктів ви порівнювали тощо?
Майк Паркхілл

9
Вибачте, але відповідь на це я вже знайшов. Я просто запитав це, щоб я міг опублікувати відповідь на потомство. Контекст насправді не важливий, як ви побачите, прочитавши відповідь. Я сподіваюся, що ця відповідь буде легко виявити за допомогою веб-пошуку у повідомленні про виключення.
Одраде

Відповіді:


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

Чому вони просто не зробили метод Equals приватним?
шитиков

4
@shytikov Тому що це неможливо. Ви не можете замінити віртуальний метод із базового класу на приватний.
Одрада

18

tldr;

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

не:

Assert.Equals(a, b); // <-- Irrelevant equality operator on Assert itself
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.