如果两个集合相等意味着x对象的顺序相同,xUnit Equal方法是否应该返回true?
示例:
var result = new List<item>()
{
new item()
{
TypeId = typesEnum.Integer,
Code = "code"
},
new item()
{
TypeId = typesEnum.Integer,
Code = "code2"
}
}
and Assert.Equal(expectedResult,result)返回false。
,我在ExpectedResult中有完全相同的列表,逐一检查每个属性,类型和所有内容。当我编写自己的IEqualityComparer并比较项目类中的每个属性时,结果为true。但是默认比较器返回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
答案 0 :(得分:-1)
这不是XUnit的问题或特殊性,而是C#的工作方式。当您有两个非原始对象且内部具有相同的值时,它们是等效的,但不等于-在内部,对于每个属性,它们具有不同的内存引用。您甚至可以尝试在if语句中使用==
或.Equals()
进行比较,并返回false。
This answer explains very well about this subject
您可以做什么:
覆盖比较运算符并使用Assert.True()
,然后对它们进行比较以返回true;
使用通过等价性提供比较的库,例如FluentAssertion:object1.Should().BeEquivalentTo(object2);