2013-12-19 3 views
2

Я использую Assert.AreEqual для сравнения двух объектов. Объекты - это два разных экземпляра одного и того же класса, и в этом классе есть метод ToString. Когда я вызываю AreEqual, я вижу из отладчика, что метод ToString вызывается (один раз для каждой из двух переменных).AreEqual сравнение объектов с ToString

Метод ToString возвращает точно ту же строку в каждом случае, но по какой-то причине метод AreEqual возвращает false.

Почему это может быть?

Ошибка

Additional information: Expected: <DeliveryTag: 0, RoutingKey: , Body: test, Headers: test: test, ContentType: text/plain> 

    But was: <DeliveryTag: 0, RoutingKey: , Body: test, Headers: test: test, ContentType: text/plain> 

ответ

3

ToString просто призван сообщить ожидаемые и фактические значения. Это не Что определяет равенство. Это Equals(object) метод, который вы должны быть переопределение для того, чтобы обеспечить семантику равенства вы заинтересованы. (Вы должны рассмотреть вопрос о внедрении IEquatable<T>, а также, но это немного отдельно.)

Короче говоря, Assert.AreEqual реализуется что-то:

// Somewhat simplified, but right general idea 
if (!expected.Equals(actual)) 
{ 
    // Note how once we've got here, it's too late... the results 
    // of ToString are irrelevant to whether or not we throw an exception 
    string expectedText = expected.ToString(); 
    string actualText = actual.ToString(); 
    string message = string.Format("Expected: {0} But was: {1}", 
     expectedText, actualText); 
    throw new AssertionFailureException(message); 
} 
Смежные вопросы