Почему этот Assert терпит неудачу? - PullRequest
4 голосов
/ 14 июня 2010
IEnumerable<ReportReceipt> expected = new List<ReportReceipt>()
{
    new ReportReceipt("fileName1","Hash1","some comments1")
};

IEnumerable<ReportReceipt> actual = new List<ReportReceipt>()
{
    new ReportReceipt("fileName1","Hash1","some comments1")
};

Assert.IsTrue(expected.SequenceEqual(actual));

Я использую MSTest с VS 2008.

Ответы [ 5 ]

6 голосов
/ 14 июня 2010

SequenceEqual определяет, равны ли две последовательности, сравнивая элементы с помощью средства сравнения по умолчанию для их типа.

Если вы не перегружали Equals и GetHashCode в своем классе, проверка на равенство резервных объектов завершится неудачей, поскольку последовательности содержат два разных объекта.

3 голосов
/ 14 июня 2010

Предположительно, потому что ReportReceipt не переопределяет Equals - поэтому он сравнивает только ссылки, и они неравны.

Переопределите Equals и GetHashCode соответственно, и все должно работать нормально.

0 голосов
/ 14 июня 2010

Если вы хотите использовать собственный компаратор для определения равенства, вы можете использовать перегрузку этого метода, описанную в MSDN

В основном вы передадите IEqualityComparer<TSource> в качестве параметра, который будет использоваться для сравнения элементов.

0 голосов
/ 14 июня 2010

Вы сравниваете два разных экземпляра ссылочных объектов - поэтому они не будут равны, если вы не реализуете Equals в типе для проверки значений свойств вместо ссылок.

Чтобы упростить это, используйтеCollectionAssert.AreEquivalent() вместо.

0 голосов
/ 14 июня 2010

Вы перегрузили оператор равенства для ReportReceipt?Разве метод SequenceEqual не проверяет наличие в памяти местоположения ReportReceipt, а не содержимого объекта?Переопределение Equals и GetHashCode должно решить вашу проблему.

Добавьте что-то вроде следующего в ReportReceipt:

public override bool Equals(object obj)
{
            if (obj == null || obj.GetType() != this.GetType)
                return false;
            ReportReceipt other = (ReportReceipt)obj;
            return this.FileName.Equals(other.FileName)
                && this.Hash.Equals(other.Hash);
        }
...