Я пишу некоторые модульные тесты, и следующее утверждение не выполняется:
Assert.AreEqual(expected.Episode, actual.Episode);
Если я назову это вместо этого, он преуспеет:
Assert.IsTrue(expected.Episode.Equals(actual.Episode));
Я предположил, что Assert.AreEqual()
в конечном итоге вызывает метод Equals()
для типа, который он задает, в этом случае Episode.Equals()
.
Однако под обложками Microsoft.VisualStudio.TestTools.UnitTesting.Assert нашел следующий код (декомпилированный ReSharper):
public static void AreEqual<T>(T expected, T actual, string message, params object[] parameters)
{
if (object.Equals((object)expected, (object)actual))
return;
Assert.HandleFail...
}
Это означает, что метод AreEqual()
отличает как expected
, так и actual
до object
для принудительного использования базового метода Equals()
, а не перегрузки, которую я написал в Episode
класс. Базовый метод будет просто проверять, совпадают ли ссылки, какими они не являются.
У меня есть два вопроса:
- Мое объяснение действительно правильно, или я что-то пропустил?
- Почему инфраструктура хочет принудительно использовать object.Equals(), а не перегрузку этого метода?
Если это актуально, вот мой метод:
public bool Equals(Episode other)
{
return Number == other.Number &&
CaseNote.Equals(other.CaseNote) &&
Patient.Equals(other.Patient);
}