繁体   English   中英

为什么这个断言失败了?

[英]Why does this Assert fail?

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。

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

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

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

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

你为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);
        }

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

为了简化这一过程,请使用CollectionAssert.AreEquivalent()代替。

如果要使用自己的比较器来确定相等性,可以使用MSDN上描述的此方法的重载

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM