Ответ 1
Вы определенно правы. Я сегодня боролся с аналогичной проблемой, пока не нашел ваш пост, и теперь я уверен, что NUnit IsEqualTo() не всегда вызывает переопределенные значения Equals.
Я говорю последовательно, потому что иногда это происходит. На самом деле у меня есть два класса. Второй - первый. Когда я вызываю Is.EqualTo() в экземплярах первого, NUnit вызывает переопределения Equals, для экземпляров второго - нет.
Хотя это очень странно, у меня нет времени для дальнейшего изучения того, что происходит.
Люди с подобными проблемами или решениями обязательно должны сообщать об этом, так как это очень раздражает, и на самом деле я сомневался в правильности моих тестов.
Тем временем я создал следующий класс Affirm, который вызывает переопределения Equals (я проверил его). Он использует NUnit для выполнения простого равенства Assert вместо Is.EqualTo() и в некоторой степени устраняет тот факт, что таким образом NUnit не дает строковых представлений объектов в случае неудачи теста.
Итак, вот оно:
using NUnit.Framework;
public static class Affirm
{
public static Affirmer That(object actual)
{
return new Affirmer(actual);
}
}
[EditorBrowsable(EditorBrowsableState.Never)]
public class Affirmer
{
readonly object _actual;
public Affirmer(object actual)
{
_actual = actual;
}
public void IsEqualTo(object expected)
{
string failureMessage = string.Format("\nExpected: <{0}>\nBut was: <{1}>", _actual, expected);
Assert.That(_actual.Equals(expected), Is.True, failureMessage);
}
public void IsNotEqualTo(object expected)
{
string failureMessage = string.Format("\nDid not excpect: <{0}>\nBut was: <{1}>", _actual, expected);
Assert.That(_actual.Equals(expected), Is.False, failureMessage);
}
}
Используйте его следующим образом:
Affirm.That(actualObject).IsEqualTo(expectedObject);
и
Affirm.That(actualObject).IsNotEqualTo(expectedObject);
Надеюсь, что это поможет.