Unit testing 为什么这个断言失败了? IEnumerable预期=新列表() { 新报告收据(“文件名1”、“哈希1”、“一些注释1”) }; IEnumerable实际值=新列表() { 新报告收据(“文件名1”、“哈希1”、“一些注释1”) }; Assert.IsTrue(预期的.SequenceEqual(实际的));
我正在用VS 2008运行MSTest。大概是因为ReportReceive没有覆盖Unit testing 为什么这个断言失败了? IEnumerable预期=新列表() { 新报告收据(“文件名1”、“哈希1”、“一些注释1”) }; IEnumerable实际值=新列表() { 新报告收据(“文件名1”、“哈希1”、“一些注释1”) }; Assert.IsTrue(预期的.SequenceEqual(实际的));,unit-testing,mstest,Unit Testing,Mstest,我正在用VS 2008运行MSTest。大概是因为ReportReceive没有覆盖Equals——所以它只是比较引用,它们是不相等的 适当重写Equals和GetHashCode,它应该可以正常工作。SequenceEqual通过使用默认的元素类型相等比较器比较元素来确定两个序列是否相等 如果未在类中重载Equals和GetHashCode,回退对象相等性检查将失败,因为序列包含两个不同的对象。是否已重载ReportReceive的相等运算符?SequenceEqual方法是否没有测试Repo
Equals
——所以它只是比较引用,它们是不相等的
适当重写
Equals
和GetHashCode
,它应该可以正常工作。SequenceEqual通过使用默认的元素类型相等比较器比较元素来确定两个序列是否相等
如果未在类中重载Equals和GetHashCode,回退对象相等性检查将失败,因为序列包含两个不同的对象。是否已重载ReportReceive的相等运算符?SequenceEqual方法是否没有测试ReportReceive在内存中的相等位置,而不是对象的内容?重写Equals和GetHashCode应该可以解决您的问题 在ReportReceive中添加以下内容:
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));
您正在比较引用对象的两个不同实例-因此,除非对类型实现
Equals
,以检查属性值而不是引用,否则它们不会相等
为了简化此操作,请改用
CollectionAssert.AreEquivalent()
。如果要使用自己的比较器来确定相等性,可以使用上介绍的此方法的重载
基本上,您将传递一个IEqualityComparer
作为参数,用于比较元素
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);
}