xUnit等于两个相同的集合,相同的顺序,相同的类型,返回false

时间:2019-03-07 13:59:33

标签: c# xunit

如果两个集合相等意味着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

1 个答案:

答案 0 :(得分:-1)

这不是XUnit的问题或特殊性,而是C#的工作方式。当您有两个非原始对象且内部具有相同的值时,它们是等效的,但不等于-在内部,对于每个属性,它们具有不同的内存引用。您甚至可以尝试在if语句中使用==.Equals()进行比较,并返回false。

This answer explains very well about this subject

您可以做什么:

  • 覆盖比较运算符并使用Assert.True(),然后对它们进行比较以返回true;

  • 使用通过等价性提供比较的库,例如FluentAssertionobject1.Should().BeEquivalentTo(object2);