【发布时间】:2019-03-07 13:59:32
【问题描述】:
如果两个集合相等,xUnit Equal 方法不应该返回 true,这意味着相同的对象具有相同的顺序吗?
例子:
var result = new List<item>()
{
new item()
{
TypeId = typesEnum.Integer,
Code = "code"
},
new item()
{
TypeId = typesEnum.Integer,
Code = "code2"
}
}
并且 Assert.Equal(expectedResult, result) 返回 false。
我在expectedResult中有完全相同的列表,一一检查,每个属性,类型,一切。当我编写自己的 IEqualityComparer 并比较其中项目类的每个属性时,结果为真。但默认比较器返回 false。这就是它应该为 xUnit 工作的方式吗?如果是这样,问题是如何比较两个集合是否相等?
自定义比较器如下所示:
internal class ItemComparer : IEqualityComparer<Item>
{
public bool Equals(Item x, Item y)
{
return x.Code.Equals(y.Code) && x.TypeId.Equals(y.TypeId)
}
public int GetHashCode(Item obj)
{
return obj.GetHashCode();
}
}
这是一个类似问题的链接: CLICK
答案是它应该像我认为的那样工作,而无需编写我自己的比较器。问题是为什么不呢?
我使用 xUnit 2.4.1
【问题讨论】:
-
"但默认比较器返回 false。"是的,如果您没有在
item中覆盖Equals 和GetHashCode,那么两个不同的对象是不相等的,即使它们具有相同的属性。您不需要编写自己的比较器,但您需要确保相等的对象按照您的意愿报告相等性。 -
那个自定义比较器有问题,顺便说一句。由于平等是通过
Code和TypeId而不是GetHashCode它不可能为cmp.Equals(x, y)返回true但对于cmp.GetHashCode(x) == cmp.GetHashCode(y)则返回false。 -
你是什么意思我不必使用自定义比较器但确保相等的对象报告我想要的相等?这本身不是制作自定义比较器吗?说到比较器,这只是一个简单的例子。