为什么这个断言失败了?

时间:2010-06-14 06:57:45

标签: unit-testing mstest

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));

我正在使用VS 2008运行MSTest。

5 个答案:

答案 0 :(得分:6)

SequenceEqual通过使用类型的默认相等比较器比较元素来确定两个序列是否相等。

如果您没有在类中重载Equals和GetHashCode,则回退对象相等性检查将失败,因为序列包含两个不同的对象。

答案 1 :(得分:3)

大概是因为ReportReceipt没有覆盖Equals - 所以它只是比较引用,而且它们是不相等的。

适当地覆盖EqualsGetHashCode,它应该可以正常工作。

答案 2 :(得分:0)

您是否为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);
        }

答案 3 :(得分:0)

您正在比较两个不同的引用对象实例 - 因此,除非您在类型上实现Equals来检查属性值而不是引用,否则它们将不相等。

为方便起见,请改用CollectionAssert.AreEquivalent()

答案 4 :(得分:0)

如果您想使用自己的比较器来确定相等性,您可以使用MSDN

中描述的此方法的重载

基本上,您将传递IEqualityComparer<TSource>作为参数,用于比较元素。